home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / sse_m1 / sse_m1.lzh / susie.ap < prev    next >
Text File  |  2000-02-04  |  73KB  |  4,082 lines

  1. *    System of Universal SCSI Integrated Engine
  2. *    Copyright 1994-95 GORRY.
  3. *    $Id: susie.ap,v 1.23 1996/12/24 12:40:13 GORRY Exp GORRY $
  4.  
  5.  
  6.         @APSTART;
  7.         @STRINGS;
  8.  
  9.  
  10.         .include    DOSCALL.MAC
  11.         .include    IOCSCALL.MAC
  12.         .include    FEFUNC10.H
  13.  
  14.         .include    GORRY\GORRY.MAC
  15.         .include    DevDrv.mac
  16.         .include    sdd.mac
  17.         .include    sddcall.mac
  18.         .include    susie.mac
  19.  
  20.         .include    pstart.def
  21.         .include    sddhed.def
  22.         .include    sdd.def
  23.         .include    keep.def
  24.         .include    DevDrv.def
  25.  
  26.  
  27. *************************************************************************
  28.  
  29.  
  30.         .text
  31.         dc.b    '$Id: susie.ap,v 1.23 1996/12/24 12:40:13 GORRY Exp GORRY $',0
  32.         .even
  33.  
  34.  
  35. *************************************************************************
  36.  
  37.  
  38.  
  39.  
  40. *************************************************************************
  41.  
  42.  
  43. EXEC_START::
  44.         bsr    INIT
  45.         bsr    INIT2
  46.         bsr    PRINTTITLE_                *** TNB
  47.                             * タイトルがいつも2行だと
  48.                             * うっとうしいのでとりあえ
  49.                             * ずこうしました。
  50.         bsr    CMD
  51.         bsr    CMD2
  52.  
  53.         tst.b    @ReqBusReset(a6)
  54.         @ifst    {
  55.             bsr    BusReset
  56.         }
  57.  
  58.         tst.b    @ReqPrintHelp(a6)
  59.         bst    PRINTHELP
  60.         tst.b    @ReqPrintStatus(a6)
  61.         bst    PRINTSTATUS
  62.         tst.b    @ReqRelease(a6)
  63.         bst    RELEASE
  64.         tst.b    @ReqChangeStatus(a6)
  65.         bst    CHANGESTATUS
  66.         bra    INSTALL
  67.  
  68.  
  69. *************************************************************************
  70.  
  71.  
  72. *    int    DDD_INSTALL( void );
  73. *
  74. *        DEVICE=で起動した時のエントリポイント。
  75. *        in    デバイスドライバ起動方法の通り
  76. *        out    デバイスドライバ起動方法の通り
  77.  
  78.  
  79.         @xproc    [ DDD_INSTALL ] {
  80.  
  81.             st.b    (DeviceInstalled)
  82.  
  83.             move.l    sp,(DDDStack)
  84.  
  85.             * 初期化以外はエラー
  86.             move.b    REQH_CommandCode(a5),d0
  87.             bne    ?_Err_CommandCode
  88.  
  89.             pea    [ 13,10,0 ](pc)
  90.             DOS    _PRINT
  91.             addq.w    #4,sp
  92.  
  93.             * 初期化
  94.             bsr    INIT
  95.  
  96.             * コマンドラインを作成
  97.             lea    @DDD_CmdLineBuf(a6),a1
  98.             move.l    REQH_ParamPtr(a5),a2
  99.             StrEnd    (a2)+
  100.             @do {
  101.                 tst.b    (a2)
  102.                 @break.eq;
  103.                 StrCpy    (a2)+,(a1)+
  104.                 move.b    #' ',-1(a1)
  105.             } @while.t;
  106.             clr.b    (a1)
  107.             lea    @DDD_CmdLineBuf(a6),a1
  108.             lea    -1(a1),a2
  109.  
  110.             bsr    INIT2
  111.             bsr    PRINTTITLE
  112.             bsr    CMD
  113.             bsr    CMD2
  114.  
  115.             tst.b    @ReqPrintHelp(a6)
  116.             bst    PRINTHELP
  117.             tst.b    @ReqPrintStatus(a6)
  118.             bst    PRINTSTATUS
  119.             tst.b    @ReqRelease(a6)
  120.             bst    RELEASE
  121.             tst.b    @ReqChangeStatus(a6)
  122.             bst    CHANGESTATUS
  123.             bra    INSTALL
  124.  
  125.           ?_OK_Quit::
  126.             lea    KEEPEND,a1
  127.             move.l    @C_Param(a6),d0
  128.             @ifne    {
  129.                 jsr    SetBufferSize
  130.                 add.l    d0,a1
  131.             }
  132.             move.l    a1,REQH_DevDrvEndPtr(a5)
  133.             moveq.l    #0,d0
  134.             bra    ?_Quit
  135.  
  136.           ?_Err_Quit::
  137.             move.w    #$700d,d0
  138.             bra    ?_Quit
  139.  
  140.           ?_Err_CommandCode::
  141.             move.w    #$5003,d0
  142.             bra    ?_Quit
  143.  
  144.           ?_Quit::
  145.             move.l    (DDDStack),sp
  146.             rts
  147.         }
  148.  
  149.  
  150. *************************************************************************
  151.  
  152.  
  153. *    void    INIT( void );
  154. *
  155. *        初期化
  156. *        in    なし
  157. *        out    なし
  158.  
  159.  
  160.         @xproc    [ INIT ] {
  161.             movem.l    d1-d7/a0-a5,-(sp)
  162.  
  163.             * DOSコールの移動処理
  164.             movem.l    a1/a2,-(sp)
  165.             DOS    _VERNUM
  166.             cmp.w    #$020f,d0
  167.             @ifcs    {
  168.                 ToSuper
  169.                 lea.l    $1940.w,a1
  170.                 lea.l    $1a00.w,a2
  171.                 move.l    (a1),d0
  172.                 cmp.l    (a2),d0
  173.                 @ifne    {
  174.                     @repeat [ d0, #$30-1 ].q {
  175.                         move.l    (a1)+,(a2)+
  176.                     }
  177.                 }
  178.                 ToUser
  179.             }
  180.             movem.l    (sp)+,a1/a2
  181.  
  182.             tst.b    (DeviceInstalled)
  183.             bst    ?_Skip_Device
  184.  
  185.             * プロセスの初期化
  186.             DOS    _GETPDB
  187.             move.l    d0,a0
  188.             lea    PEND,a1
  189.             move.l    a1,-(sp)
  190.             suba.l    a0,a1
  191.             move.l    a1,-(sp)
  192.             move.l    a0,-(sp)
  193.             DOS    _SETBLOCK
  194.             addq.w    #8,sp
  195.             tst.l    d0
  196.             bmi    ERROR_MEM
  197.             lea    -$10(a0),a0
  198.             move.l    (sp)+,$38(a0)            * プロセスの初期スタックアドレス
  199.             pea    ABORT(pc)
  200.             move.w    #$fff2,-(sp)            * アボート時の戻りアドレス
  201.             DOS    _INTVCS
  202.             subq.w    #1,(sp)                * CTRL+C時の戻りアドレス
  203.             DOS    _INTVCS
  204.             addq.w    #6,sp
  205.  
  206.             * 高速BSSクリア
  207.             movem.l    a1/a2,-(sp)
  208.             lea    BSSSTART,a1
  209.             move.l    a1,a6
  210.             move.l    #(BSSEND-BSSSTART),d0
  211.             divu    #16,d0
  212.             moveq.l    #0,d1
  213.             subq.w    #1,d0
  214.             @ifpl    {
  215.                 @repeat [ d0 ].w {
  216.                     move.l    d1,(a1)+
  217.                     move.l    d1,(a1)+
  218.                     move.l    d1,(a1)+
  219.                     move.l    d1,(a1)+
  220.                 }
  221.             }
  222.             swap    d0
  223.             subq.w    #1,d0
  224.             @ifpl    {
  225.                 @repeat [ d0 ].w {
  226.                     move.b    d1,(a1)+
  227.                 }
  228.             }
  229.             movem.l    (sp)+,a1/a2
  230.  
  231.           ?_Skip_Device::
  232.             lea    BSSSTART(pc),a6
  233.  
  234.           ?_Quit::
  235.             movem.l    (sp)+,d1-d7/a0-a5
  236.             rts
  237.         }
  238.  
  239.  
  240. *************************************************************************
  241.  
  242.  
  243. *    void    INIT2( void );
  244. *
  245. *        初期化2
  246. *        in    なし
  247. *        out    なし
  248.  
  249.  
  250.         @xproc    [ INIT2 ] {
  251.             movem.l    d1-d7/a0-a5,-(sp)
  252.  
  253.             * TWOSCSIチェック
  254.             SCSI $1e
  255.             cmpi.b    #-2,d0
  256.             @ifeq    {
  257.                 st.b    @ReadyTWOSCSI(a6)
  258.             }
  259.  
  260.             ToSuper
  261.             move.l    ($00b8.w),@DOSERRVectorKeep(a6)
  262.             jsr    InstallSCSICALL
  263.             tst.l    d0
  264.             bmi    ERROR_SCSICALL
  265.             ToUser
  266.  
  267.             move.w    #DEFCDROMCacheBufSize,d0
  268.             jsr    SetBufferSize
  269.  
  270.             bsr    CutSubst
  271.             move.l    #-1,@CmdSCSI_ID(a6)
  272.             move.w    #-1,@CmdSCSI_LUN(a6)
  273.             st.b    @ReqTestRWEXT1(a6)
  274.             bsr    InitializeKeepSUSIE
  275.             bsr    AskSCSIID
  276.  
  277.           ?_Quit::
  278.             movem.l    (sp)+,d1-d7/a0-a5
  279.             rts
  280.         }
  281.  
  282.  
  283. *************************************************************************
  284.  
  285.  
  286. *    void    PRINTTITLE( void );
  287. *
  288. *        タイトル表示
  289. *        in    なし
  290. *        out    なし
  291.  
  292.  
  293.         @xproc    [ PRINTTITLE ] {
  294.             movem.l    d1-d7/a0-a5,-(sp)
  295.  
  296.             move.w    ##STDERR,-(sp)
  297.             pea    [ 'SUSIE: System of Universal SCSI Integrated Engine : V'
  298.                   '0'+SUSIEVERH
  299.                   '.'
  300.                   '0'+SUSIEVERM
  301.                   '0'+SUSIEVERL
  302.                   SUSIEVERR
  303.                   '+t1'                    *** TNB
  304.                   '+m1'                    *** Mitsuky
  305.                   ' : Copyright 1994-97 GORRY.',13,10,0 ](pc)
  306.             DOS    _FPUTS
  307.             addq.w    #6,sp
  308.  
  309.           ?_Quit::
  310.             movem.l    (sp)+,d1-d7/a0-a5
  311.             rts
  312.         }
  313.  
  314.                                     *---------- TNB
  315.         @xproc    [ PRINTTITLE_ ] {
  316.             movem.l    d1-d7/a0-a5,-(sp)
  317.  
  318.             move.w    ##STDERR,-(sp)
  319.             pea    [ 'SUSIE: System of Universal SCSI Integrated Engine : V'
  320.                   '0'+SUSIEVERH
  321.                   '.'
  322.                   '0'+SUSIEVERM
  323.                   '0'+SUSIEVERL
  324.                   SUSIEVERR
  325.                   '+t1'
  326.                   '+m1'
  327.                   ' : Copyright 1994-97 GORRY.',13,10
  328.                   '                            '
  329.                   '   LS-120 対応 1997 TNB製作所',13,10
  330.                   '                            '
  331.                   '   FDISK 対応  2000 Mitsuky.',13,10,0 ](pc)
  332.             DOS    _FPUTS
  333.             addq.w    #6,sp
  334.  
  335.           ?_Quit::
  336.             movem.l    (sp)+,d1-d7/a0-a5
  337.             rts
  338.         }
  339.                                     *---------- TNB
  340.  
  341.  
  342. *************************************************************************
  343.  
  344.  
  345. *    void    CMD( void );
  346. *
  347. *        コマンドライン解析
  348. *        in    a2    コマンドラインへのポインタ
  349. *        out    なし
  350.  
  351.  
  352.         @xproc    [ CMD ] {
  353.             movem.l    d1-d7/a0-a6,-(sp)
  354.             addq.w    #1,a2
  355.  
  356.             * 環境変数SLASH解析
  357.             clr.b    @TmpEnvBuf(a6)
  358.             pea    @TmpEnvBuf(a6)
  359.             clr.l    -(sp)
  360.             pea    [ 'SLASH',0 ](pc)
  361.             DOS    _GETENV
  362.             lea    12(sp),sp
  363.             tst.l    d0
  364.             @ifpl    {
  365.                 cmpi.b    #'/',@TmpEnvBuf(a6)
  366.                 seq.b    @SlashFlag(a6)
  367.             }
  368.  
  369.           ?_lp::
  370.             move.l    a2,a3
  371.             move.b    (a2)+,d0
  372.             beq    ?_e
  373.             cmpi.b    #' '+1,d0
  374.             bcs    ?_lp
  375.             cmpi.b    #'-',d0
  376.             beq    ?_Option
  377.             tst.b    @SlashFlag(a6)
  378.             @ifcl    {
  379.                 cmpi.b    #'/',d0
  380.                 beq    ?_Option
  381.             }
  382.  
  383.             ToUpper    d0
  384.             cmpi.b    #'*',d0
  385.             @ifeq    {
  386.                 tst.w    @CmdDrvCnt(a6)
  387.                 bne    ?_Err
  388.             } @else {
  389.                 cmpi.b    #'@',d0
  390.                 bcs    ?_Err
  391.                 cmpi.b    #'Z'+1,d0
  392.                 bcc    ?_Err
  393.             }
  394.             cmpi.b    #':',(a2)
  395.             bne    ?_Err
  396.             move.w    @CmdDrvCnt(a6),d1
  397.             move.b    d0,@CmdDrv(a6,d1.w)
  398.             clr.b    1+@CmdDrv(a6,d1.w)
  399.             addq.w    #1,@CmdDrvCnt(a6)
  400.             addq.w    #1,a2
  401.  
  402.           ?_Next::
  403.             move.b    (a2),d0
  404.             cmpi.b    #' '+1,d0
  405.             bcc    ?_Err
  406.             bra    ?_lp
  407.  
  408.           ?_Option::
  409.             move.b    (a2)+,d0
  410.             ToUpper    d0
  411.             @switch [ d0 ].b {
  412.               @case    #'?':
  413.                 * -?
  414.                 st.b    @ReqPrintHelp(a6)
  415.                 @break;
  416.               @case    #'R':
  417.                 * -R
  418.                 move.b    (a2),d0
  419.                 ToUpper    d0
  420.                 @switch [ d0 ].b {
  421.                   @case    #'B':
  422.                     * -RB
  423.                     addq.w    #1,a2
  424.                     move.b    (a2),d0
  425.                     ToUpper    d0
  426.                     @switch [ d0 ].b {
  427.                       @case    #'0':
  428.                         * -RB0
  429.                         addq.w    #1,a2
  430.                         st.b    @ReqBrowseResource0(a6)
  431.                         clr.b    @ReqBrowseResource1(a6)
  432.                         @break;
  433.                       @case    #'1':
  434.                         * -RB1
  435.                         addq.w    #1,a2
  436.                         st.b    @ReqBrowseResource1(a6)
  437.                         @break;
  438.                     }
  439.                     @break;
  440.                   @case    #'S':
  441.                     * -RS
  442.                     addq.w    #1,a2
  443.                     st.b    @ReqBusReset(a6)
  444.                     @break;
  445.                   @default:
  446.                     st.b    @ReqRelease(a6)
  447.                     @break;
  448.                 }
  449.                 @break;
  450.               @case    #'P':
  451.                 * -P
  452.                 st.b    @ReqPrintStatus(a6)
  453.                 @break;
  454.               @case    #'I':
  455.                 * -I
  456.                 move.b    (a2),d0
  457.                 ToUpper    d0
  458.                 @switch [ d0 ].b {
  459.                   @case    #'D':
  460.                     * -ID
  461.                     addq.w    #1,a2
  462.                     move.b    (a2)+,d0
  463.                     ToUpper    d0
  464.                     cmpi.b    #'A',d0
  465.                     @ifcc    {
  466.                         subi.b    #'A'-10,d0
  467.                     } @else {
  468.                         subi.b    #'0',d0
  469.                         bcs    ?_Err
  470.                         cmpi.b    #9+1,d0
  471.                         bcc    ?_Err
  472.                         move.b    (a2),d1
  473.                         subi.b    #'0',d1
  474.                         @ifcc    {
  475.                             cmpi.b    #9+1,d1
  476.                             @ifcs    {
  477.                                 add.b    d0,d0
  478.                                 add.b    d0,d1
  479.                                 add.b    d0,d0
  480.                                 add.b    d0,d0
  481.                                 add.b    d1,d0
  482.                                 addq.w    #1,a2
  483.                             }
  484.                         }
  485.                     }
  486.                     tst.b    @ReadyTWOSCSI(a6)
  487.                     @ifst    {
  488.                         cmpi.b    #15+1,d0
  489.                     } @else {
  490.                         cmpi.b    #7+1,d0
  491.                     }
  492.                     bcc    ?_Err
  493.                     andi.l    #$ff,d0
  494.                     ori.l    #$00080000,d0    * LUN無効
  495.                     move.l    @CmdSCSI_ID(a6),d1
  496.                     @ifpl    {
  497.                         move.w    d0,d1
  498.                         move.l    d1,d0
  499.                     }
  500.                     move.l    d0,@CmdSCSI_ID(a6)
  501.                     @break;
  502.                   @default:
  503.                     st.b    @I_Option(a6)
  504.                     @break;
  505.                 }
  506.                 @break;
  507.               @case    #'L':
  508.                 * -L
  509.                 move.b    (a2),d0
  510.                 ToUpper    d0
  511.                 @switch [ d0 ].b {
  512.                   @case    #'U':
  513.                     * -LU
  514.                     addq.w    #1,a2
  515.                     move.b    (a2),d0
  516.                     ToUpper    d0
  517.                     @switch [ d0 ].b {
  518.                       @case    #'N':
  519.                         * -LUN
  520.                         addq.w    #1,a2
  521.                         move.b    (a2)+,d0
  522.                         cmpi.b    #'-',d0
  523.                         @ifeq    {
  524.                             moveq.l    #8,d0    * LUN無効
  525.                         } @else {
  526.                             subi.b    #'0',d0
  527.                             bcs    ?_Err
  528.                             cmpi.b    #7+1,d0
  529.                             bcc    ?_Err
  530.                         }
  531.                         andi.l    #$ff,d0
  532.                         move.w    d0,@CmdSCSI_LUN(a6)
  533.                         swap    d0
  534.                         move.l    @CmdSCSI_ID(a6),d1
  535.                         move.w    d1,d0
  536.                         move.l    d0,@CmdSCSI_ID(a6)
  537.                         @break;
  538.                     }
  539.                 }
  540.                 @break;
  541.               @case    #'K':
  542.                 * -K
  543.                 st.b    @ReqUnkillDriver(a6)
  544.                 @break;
  545.               @case    #'F':
  546.                 * -F
  547.                 st.b    @ReqForceKillDriver(a6)
  548.                 @break;
  549.               @case    #'E':
  550.                 * -E
  551.                 move.b    (a2),d0
  552.                 ToUpper    d0
  553.                 @switch [ d0 ].b {
  554.                   @case    #'0':
  555.                     * -E0
  556.                     addq.w    #1,a2
  557.                     clr.b    @ReqForceEject1(a6)
  558.                     st.b    @ReqForceEject0(a6)
  559.                     @break;
  560.                   @case    #'1':
  561.                     * -E1
  562.                     addq.w    #1,a2
  563.                     st.b    @ReqForceEject1(a6)
  564.                     @break;
  565.                   @case    #'X':
  566.                     * -EX
  567.                     addq.w    #1,a2
  568.                     move.b    (a2),d0
  569.                     @switch [ d0 ].b {
  570.                       @case    #'0':
  571.                         * -EX0
  572.                         addq.w    #1,a2
  573.                         clr.b    @ReqTestRWEXT1(a6)
  574.                         st.b    @ReqTestRWEXT0(a6)
  575.                         @break;
  576.                       @case    #'1':
  577.                         * -EX1
  578.                         addq.w    #1,a2
  579.                         st.b    @ReqTestRWEXT1(a6)
  580.                         @break;
  581.                       @default:
  582.                         * -EX
  583.                         st.b    @ReqTestRWEXT1(a6)
  584.                         @break;
  585.                     }
  586.                     @break;
  587.                   @default:
  588.                     st.b    @ReqForceEject1(a6)
  589.                     @break;
  590.                 }
  591.                 @break;
  592.               @case    #'W':
  593.                 * -W
  594.                 move.b    (a2),d0
  595.                 @switch [ d0 ].b {
  596.                   @case    #'0':
  597.                     * -W0
  598.                     addq.w    #1,a2
  599.                     clr.b    @ReqForceProtect1(a6)
  600.                     st.b    @ReqForceProtect0(a6)
  601.                     @break;
  602.                   @case    #'1':
  603.                     * -W1
  604.                     addq.w    #1,a2
  605.                     st.b    @ReqForceProtect1(a6)
  606.                     @break;
  607.                   @default:
  608.                     st.b    @ReqForceProtect1(a6)
  609.                     @break;
  610.                 }
  611.                 @break;
  612.               @case    #'S':
  613.                 * -S
  614.                 move.b    (a2),d0
  615.                 ToUpper    d0
  616.                 @switch [ d0 ].b {
  617.                   @case    #'I':
  618.                     * -SI
  619.                     addq.w    #1,a2
  620.                     st.b    @SI_Option(a6)
  621.                     @break;
  622.                   @default:
  623.                     @break;
  624.                 }
  625.                 @break;
  626.               @case    #'9':
  627.                 move.b    (a2),d0
  628.                 @switch [ d0 ].b {
  629.                   @case    #'8':
  630.                     addq.w    #1,a2
  631.                     move.b    (a2),d0
  632.                     @switch [ d0 ].b {
  633.                       @case    #':':
  634.                         addq.w    #1,a2
  635.                         move.b    (a2),d0
  636.                         ToUpper    d0
  637.                         @switch [ d0 ].b {
  638.                           @case    #'C':
  639.                             * -98:C
  640.                             addq.w    #1,a2
  641.                             st.b    @98C_Option(a6)
  642.                             bsr    ?_GetNum
  643.                             move.l    d0,@98C_Param(a6)
  644.                             @break;
  645.                         }
  646.                         @break;
  647.                     }
  648.                     @break;
  649.                 }
  650.                 @break;
  651.               @case    #'B':
  652.                 * -B
  653.                 move.b    (a2),d0
  654.                 @switch [ d0 ].b {
  655.                   @case    #'0':
  656.                     * -B0
  657.                     addq.w    #1,a2
  658.                     clr.b    @ReqWaitBusy1(a6)
  659.                     st.b    @ReqWaitBusy0(a6)
  660.                     @break;
  661.                   @case    #'1':
  662.                     * -B1
  663.                     addq.w    #1,a2
  664.                     st.b    @ReqWaitBusy1(a6)
  665.                     @break;
  666.                   @default:
  667.                     st.b    @ReqWaitBusy1(a6)
  668.                     @break;
  669.                 }
  670.                 @break;
  671.               @case    #'V':
  672.                 * -V
  673.                 move.b    (a2),d0
  674.                 @switch [ d0 ].b {
  675.                   @case    #'0':
  676.                     * -V0
  677.                     addq.w    #1,a2
  678.                     clr.b    @ReqHardVerify3(a6)
  679.                     clr.b    @ReqHardVerify2(a6)
  680.                     clr.b    @ReqHardVerify1(a6)
  681.                     st.b    @ReqHardVerify0(a6)
  682.                     @break;
  683.                   @case    #'1':
  684.                     * -V1
  685.                     addq.w    #1,a2
  686.                     clr.b    @ReqHardVerify3(a6)
  687.                     clr.b    @ReqHardVerify2(a6)
  688.                     st.b    @ReqHardVerify1(a6)
  689.                     @break;
  690.                   @case    #'2':
  691.                     * -V2
  692.                     addq.w    #1,a2
  693.                     clr.b    @ReqHardVerify3(a6)
  694.                     st.b    @ReqHardVerify2(a6)
  695.                     @break;
  696.                   @case    #'3':
  697.                     * -V3
  698.                     addq.w    #1,a2
  699.                     st.b    @ReqHardVerify3(a6)
  700.                     @break;
  701.                   @default:
  702.                     clr.b    @ReqHardVerify3(a6)
  703.                     clr.b    @ReqHardVerify2(a6)
  704.                     st.b    @ReqHardVerify1(a6)
  705.                     @break;
  706.                 }
  707.                 @break;
  708.               @case    #'H':
  709.                 * -H
  710.                 move.b    (a2),d0
  711.                 @switch [ d0 ].b {
  712.                   @case    #'0':
  713.                     * -H0
  714.                     addq.w    #1,a2
  715.                     clr.b    @ReqAllowRezeroUnit1(a6)
  716.                     st.b    @ReqAllowRezeroUnit0(a6)
  717.                     @break;
  718.                   @case    #'1':
  719.                     * -H1
  720.                     addq.w    #1,a2
  721.                     st.b    @ReqAllowRezeroUnit1(a6)
  722.                     @break;
  723.                   @default:
  724.                     st.b    @ReqAllowRezeroUnit1(a6)
  725.                     @break;
  726.                 }
  727.                 @break;
  728.               @case    #'Z':
  729.                 * -Z
  730.                 st.b    @Z_Option(a6)
  731.                 @break;
  732.               @case    #'U':
  733.                 * -U
  734.                 move.b    (a2),d0
  735.                 @switch [ d0 ].b {
  736.                   @case    #'0':
  737.                     * -U0
  738.                     addq.w    #1,a2
  739.                     clr.b    @ReqAllowUnconnect1(a6)
  740.                     st.b    @ReqAllowUnconnect0(a6)
  741.                     @break;
  742.                   @case    #'1':
  743.                     * -U1
  744.                     addq.w    #1,a2
  745.                     st.b    @ReqAllowUnconnect1(a6)
  746.                     @break;
  747.                   @default:
  748.                     st.b    @ReqAllowUnconnect1(a6)
  749.                     @break;
  750.                 }
  751.                 @break;
  752.               @case    #'T':
  753.                 move.b    (a2),d0
  754.                 ToUpper    d0
  755.                 @switch [ d0 ].b {
  756.                   @case    #'I':
  757.                     * -TI
  758.                     addq.w    #1,a2
  759.                     st.b    @TI_Option(a6)
  760.                     bsr    ?_GetNum
  761.                     tst.l    d0
  762.                     ble    ERROR_TI_Param
  763.                     cmpi.l    #10000,d0
  764.                     bgt    ERROR_TI_Param
  765.                     move.l    d0,@TI_Param(a6)
  766.                     @break;
  767.                   @case    #'E':
  768.                     * -TE
  769.                     addq.w    #1,a2
  770.                     st.b    @TE_Option(a6)
  771.                     bsr    ?_GetNum
  772.                     tst.l    d0
  773.                     ble    ERROR_TE_Param
  774.                     cmpi.l    #10000,d0
  775.                     bgt    ERROR_TE_Param
  776.                     move.l    d0,@TE_Param(a6)
  777.                     @break;
  778.                   @case    #'W':
  779.                     * -TW
  780.                     addq.w    #1,a2
  781.                     st.b    @TW_Option(a6)
  782.                     bsr    ?_GetNum
  783.                     tst.l    d0
  784.                     ble    ERROR_TW_Param
  785.                     cmpi.l    #10000,d0
  786.                     bgt    ERROR_TW_Param
  787.                     move.l    d0,@TW_Param(a6)
  788.                     @break;
  789.                 }
  790.                 @break;
  791.               @case    #'C':
  792.                 * -C
  793.                 st.b    @C_Option(a6)
  794.                 bsr    ?_GetNum
  795.                 cmpi.l    #MINCDROMCacheBufSize,d0
  796.                 blt    ERROR_C_Param
  797.                 cmpi.l    #MAXCDROMCacheBufSize,d0
  798.                 bgt    ERROR_C_Param
  799.                 move.l    d0,@C_Param(a6)
  800.                 @break;
  801.               @case    #'A':
  802.                 * -A
  803.                 move.b    (a2),d0
  804.                 ToUpper    d0
  805.                 @switch [ d0 ].b {
  806.                   @case    #'A':
  807.                     * -AA
  808.                     addq.w    #1,a2
  809.                     move.b    (a2),d0
  810.                     @switch [ d0 ].b {
  811.                       @case    #'0':
  812.                         * -AA0
  813.                         addq.w    #1,a2
  814.                         clr.b    @ReqSendPlayAudioAdr1(a6)
  815.                         st.b    @ReqSendPlayAudioAdr0(a6)
  816.                         @break;
  817.                       @case    #'1':
  818.                         * -AA1
  819.                         addq.w    #1,a2
  820.                         st.b    @ReqSendPlayAudioAdr1(a6)
  821.                         @break;
  822.                       @default:
  823.                         st.b    @ReqSendPlayAudioAdr1(a6)
  824.                         @break;
  825.                     }
  826.                     @break;
  827.                 }
  828.                 @break;
  829.               @default:
  830.                 bra    ?_Err
  831.             }
  832.             bra    ?_Next
  833.  
  834.           ?_e::
  835.             bra    ?_Quit
  836.  
  837.           ?_Err::
  838.             bra    ERROR_CMD
  839.  
  840.           ?_Quit::
  841.             movem.l    (sp)+,d1-d7/a0-a6
  842.             rts
  843.  
  844.           ?_GetNum::
  845.             move.l    d1,-(sp)
  846.             moveq.l    #0,d0
  847.             @do {
  848.                 moveq.l    #0,d1
  849.                 move.b    (a2)+,d1
  850.                 subi.b    #'0',d1
  851.                 @break.cs;
  852.                 cmpi.b    #9+1,d1
  853.                 @break.cc;
  854.                 add.l    d0,d0
  855.                 move.l    d0,-(sp)
  856.                 lsl.l    #2,d0
  857.                 add.l    (sp)+,d0
  858.                 add.l    d1,d0
  859.             } @while.t;
  860.             subq.w    #1,a2
  861.             move.l    (sp)+,d1
  862.             rts
  863.         }
  864.  
  865.  
  866. *************************************************************************
  867.  
  868.  
  869. *    void    CMD2( void );
  870. *
  871. *        コマンドライン追加解析
  872. *        in    なし
  873. *        out    なし
  874.  
  875.  
  876.         @xproc    [ CMD2 ] {
  877.             movem.l    d1-d7/a0-a6,-(sp)
  878.  
  879.             move.l    @CmdSCSI_ID(a6),d0
  880.             tst.w    d0
  881.             @ifmi    {
  882.                 move.l    #-1,@CmdSCSI_ID(a6)
  883.             }
  884.  
  885.             tst.w    @CmdDrvCnt(a6)
  886.             @ifne    {
  887.                 tst.b    @Z_Option(a6)
  888.                 @ifcl    {
  889.                     tst.l    @CmdSCSI_ID(a6)
  890.                     @ifpl    {
  891.                         tst.b    @ReqUnkillDriver(a6)
  892.                         bst    ERROR_IDandDRVandUnkill
  893.                     }
  894.                 }
  895.                 bra    ?_Quit
  896.             }
  897.  
  898.             tst.l    @CmdSCSI_ID(a6)
  899.             bmi    ?_Quit
  900.  
  901.             tst.b    @ReqUnkillDriver(a6)
  902.             @ifeq    {
  903.                 tst.b    @ReqRelease(a6)
  904.                 @ifeq    {
  905.                     tst.b    @ReqForceKillDriver(a6)
  906.                     @ifcl    {
  907.                         st.b    @ReqPrintStatus(a6)
  908.                     }
  909.                 }
  910.             }
  911.  
  912.           ?_Do::
  913.             bsr    MakeID2Drive
  914.  
  915.           ?_Quit::
  916.             movem.l    (sp)+,d1-d7/a0-a6
  917.             rts
  918.         }
  919.  
  920.  
  921. *************************************************************************
  922.  
  923.  
  924. *    void    MakeID2Drive( void );
  925. *
  926. *        SCSI IDをドライブ名化する。
  927. *        in    なし
  928. *        out    なし
  929.  
  930.  
  931.         @xproc    [ MakeID2Drive ] {
  932.             movem.l    d1-d7/a0-a6,-(sp)
  933.  
  934.             clr.w    @CmdDrvCnt(a6)
  935.  
  936.             moveq.l    #0,d7
  937.             move.l    @CmdSCSI_ID(a6),d0
  938.             move.b    d0,d7
  939.             andi.b    #$0f,d7
  940.             swap    d0
  941.             lsl.b    #4,d0
  942.             or.b    d0,d7
  943.             rol.w    #8,d7
  944.             lea    @CmdDrv(a6),a1
  945.  
  946.           ?_lp::
  947.             lea    @DrvSCSIIDTable(a6),a0
  948.             moveq.l    #0,d5
  949.             @repeat [ d6, #26-1 ].q {
  950.                 addq.w    #2,a0
  951.                 cmp.w    (a0)+,d7
  952.                 beq    ?_Found
  953.                 addq.b    #1,d5
  954.             }
  955.             bra    ?_lp_e
  956.  
  957.           ?_Found::
  958.             move.w    -4(a0),@FormatType(a6)
  959.             moveq.l    #'A',d0
  960.             add.b    d5,d0
  961.             move.b    d0,(a1)+
  962.             addq.w    #1,@CmdDrvCnt(a6)
  963.             addq.b    #1,d7
  964.             bra    ?_lp
  965.  
  966.           ?_lp_e::
  967.             clr.b    (a1)
  968.  
  969.           ?_Quit::
  970.             movem.l    (sp)+,d1-d7/a0-a6
  971.             rts
  972.         }
  973.  
  974.  
  975. *************************************************************************
  976.  
  977.  
  978. *    void    MakeID2Drive2( void );
  979. *
  980. *        SCSIでないドライブをドライブ名化する。
  981. *        in    なし
  982. *        out    なし
  983.  
  984.  
  985.         @xproc    [ MakeID2Drive2 ] {
  986.             movem.l    d1-d7/a0-a6,-(sp)
  987.  
  988.             move.w    #SDD_FormatType_ERROR,@FormatType(a6)
  989.             clr.w    @CmdDrvCnt(a6)
  990.             lea    @CmdDrv(a6),a1
  991.  
  992.           ?_lp::
  993.             lea    @DrvSCSIIDTable(a6),a0
  994.             moveq.l    #0,d5
  995.             @repeat [ d6, #26-1 ].q {
  996.                 addq.w    #2,a0
  997.                 move.w    (a0)+,d0
  998.                 andi.w    #$f000,d0
  999.                 cmpi.w    #$f000,d0    * LUN対策
  1000.                 @ifeq    {
  1001.                     moveq.l    #'A',d0
  1002.                     add.b    d5,d0
  1003.                     move.b    d0,(a1)+
  1004.                     addq.w    #1,@CmdDrvCnt(a6)
  1005.                 }
  1006.                 addq.b    #1,d5
  1007.             }
  1008.             clr.b    (a1)
  1009.  
  1010.           ?_Quit::
  1011.             movem.l    (sp)+,d1-d7/a0-a6
  1012.             rts
  1013.         }
  1014.  
  1015.  
  1016. *************************************************************************
  1017.  
  1018.  
  1019. *    void    MakeAST2Drive( void );
  1020. *
  1021. *        "*:"をパーティション数だけの"@:"に置換する。
  1022. *        in    なし
  1023. *        out    なし
  1024.  
  1025.  
  1026.         @xproc    [ MakeAST2Drive ] {
  1027.             movem.l    d1-d7/a0-a6,-(sp)
  1028.             ToSuper
  1029.  
  1030.             moveq.l    #0,d1
  1031.             moveq.l    #SDDCALL_CalibrateSDD,d0
  1032.             jsr    __DEVD_HOOK
  1033.             swap    d0
  1034.             tst.w    d0
  1035.             @ifmi    {
  1036.                 moveq.l    #1,d0
  1037.             } @else {
  1038.                 ror.w    #8,d0
  1039.                 andi.w    #$ff,d0
  1040.                 @ifeq    {
  1041.                     moveq.l    #1,d0
  1042.                 }
  1043.             }
  1044.             move.w    d0,@CmdDrvCnt(a6)
  1045.             subq.w    #1,d0
  1046.             lea    @CmdDrv(a6),a1
  1047.             @repeat    [ d0 ].w {
  1048.                 move.b    #'@',(a1)+
  1049.             }
  1050.             clr.b    (a1)
  1051.  
  1052.           ?_Quit::
  1053.             ToUser
  1054.             movem.l    (sp)+,d1-d7/a0-a6
  1055.             rts
  1056.         }
  1057.  
  1058.  
  1059. *************************************************************************
  1060.  
  1061.  
  1062. *    void    SetIgnoreDOSERR( void );
  1063. *
  1064. *        DOSのエラー処理を封じる。
  1065. *        in    なし
  1066. *        out    なし
  1067.  
  1068.  
  1069.         @xproc    [ SetIgnoreDOSERR ] {
  1070.             movem.l    d1-d7/a0-a6,-(sp)
  1071.  
  1072.             ToSuper
  1073.  
  1074.             lea    ?_Ignore(pc),a0
  1075.             move.l    a0,($00b8.w)
  1076.  
  1077.           ?_Quit::
  1078.             ToUser
  1079.             movem.l    (sp)+,d1-d7/a0-a6
  1080.             rts
  1081.  
  1082.           ?_Ignore::
  1083.             move.w    #2,d7
  1084.             rte
  1085.  
  1086.         }
  1087.  
  1088.  
  1089. *************************************************************************
  1090.  
  1091.  
  1092. *    void    RestoreDOSERR( void );
  1093. *
  1094. *        DOSのエラー処理を元に戻す。
  1095. *        in    なし
  1096. *        out    なし
  1097.  
  1098.  
  1099.         @xproc    [ RestoreDOSERR ] {
  1100.             movem.l    d1-d7/a0-a6,-(sp)
  1101.  
  1102.             ToSuper
  1103.  
  1104.             move.l    @DOSERRVectorKeep(a6),($00b8.w)
  1105.  
  1106.           ?_Quit::
  1107.             ToUser
  1108.             movem.l    (sp)+,d1-d7/a0-a6
  1109.             rts
  1110.         }
  1111.  
  1112.  
  1113. *************************************************************************
  1114.  
  1115.  
  1116. *    void    CutSubst( void );
  1117. *
  1118. *        SUBSTされているドライブを全て解除する。
  1119. *        in    なし
  1120. *        out    なし
  1121.  
  1122.  
  1123.         @xproc    [ CutSubst ] {
  1124.             movem.l    d1-d7/a0-a6,-(sp)
  1125.  
  1126.             bsr    SetIgnoreDOSERR
  1127.  
  1128.             DOS    _CURDRV
  1129.             move.w    d0,-(sp)
  1130.  
  1131.             moveq.l    #0,d5
  1132.             lea    @SUBSTKeepBuf(a6),a1
  1133.             @repeat [ d6, #26-1 ].q {
  1134.                 * ドライブ名作成
  1135.                 move.l    #$413a0000,-(sp)    * 'A:',0
  1136.                 add.b    d5,(sp)
  1137.                 move.l    sp,a2
  1138.  
  1139.                 * 元情報保存
  1140.                 pea    SSUB_Name(a1)
  1141.                 move.l    a2,-(sp)
  1142.                 clr.w    -(sp)
  1143.                 DOS    _ASSIGN
  1144.                 lea    10(sp),sp
  1145.                 move.l    d0,SSUB_MD(a1)
  1146.  
  1147.                 * 各状態の解除
  1148.                 @switch [ d0 ].l {
  1149.                   @case    #$40:
  1150.                     move.l    #$413a5c00,-(sp)    * 'A:\',0
  1151.                     add.b    d5,(sp)
  1152.                     move.l    sp,-(sp)
  1153.                     DOS    _CHDIR
  1154.                     addq.w    #8,sp
  1155.                     @break;
  1156.                   @case    #$50:
  1157.                   @case    #$60:
  1158.                     move.l    a2,-(sp)
  1159.                     move.w    #4,-(sp)
  1160.                     DOS    _ASSIGN
  1161.                     addq.w    #6,sp
  1162.                     @break;
  1163.                 }
  1164.  
  1165.                 * Next
  1166.                 addq.w    #4,sp
  1167.                 addq.w    #1,d5
  1168.                 lea    SizeOfSSUB(a1),a1
  1169.             }
  1170.  
  1171.             DOS    _CHGDRV
  1172.             addq.w    #2,sp
  1173.  
  1174.             bsr    RestoreDOSERR
  1175.  
  1176.           ?_Quit::
  1177.             movem.l    (sp)+,d1-d7/a0-a6
  1178.             rts
  1179.         }
  1180.  
  1181.  
  1182. *************************************************************************
  1183.  
  1184.  
  1185. *    void    RemainSubst( void );
  1186. *
  1187. *        解除したSUBSTを元に戻す。
  1188. *        in    なし
  1189. *        out    なし
  1190.  
  1191.  
  1192.         @xproc    [ RemainSubst ] {
  1193.             movem.l    d1-d7/a0-a6,-(sp)
  1194.  
  1195.             bsr    SetIgnoreDOSERR
  1196.  
  1197.             DOS    _CURDRV
  1198.             move.w    d0,-(sp)
  1199.  
  1200.             moveq.l    #0,d5
  1201.             lea    @SUBSTKeepBuf(a6),a1
  1202.             @repeat [ d6, #26-1 ].q {
  1203.                 * ドライブ名作成
  1204.                 move.l    #$413a0000,-(sp)    * 'A:',0
  1205.                 add.b    d5,(sp)
  1206.                 move.l    sp,a2
  1207.  
  1208.                 * 各状態の復活
  1209.                 move.l    SSUB_MD(a1),d0
  1210.                 @switch [ d0 ].l {
  1211.                   @case    #$40:
  1212.                     pea    SSUB_Name(a1)
  1213.                     DOS    _CHDIR
  1214.                     addq.w    #4,sp
  1215.                     @break;
  1216.                   @case    #$50:
  1217.                   @case    #$60:
  1218.                     move.w    d0,-(sp)
  1219.                     pea    SSUB_Name(a1)
  1220.                     move.l    a2,-(sp)
  1221.                     move.w    #1,-(sp)
  1222.                     DOS    _ASSIGN
  1223.                     lea    12(sp),sp
  1224.                     @break;
  1225.                 }
  1226.  
  1227.                 * Next
  1228.                 addq.w    #4,sp
  1229.                 addq.w    #1,d5
  1230.                 lea    SizeOfSSUB(a1),a1
  1231.             }
  1232.  
  1233.             DOS    _CHGDRV
  1234.             addq.w    #2,sp
  1235.  
  1236.             bsr    RestoreDOSERR
  1237.  
  1238.           ?_Quit::
  1239.             movem.l    (sp)+,d1-d7/a0-a6
  1240.             rts
  1241.         }
  1242.  
  1243.  
  1244. *************************************************************************
  1245.  
  1246.  
  1247. *    void    SetForceEject( void );
  1248. *
  1249. *        強制イジェクトフラグを設定する。
  1250. *        in    なし
  1251. *        out    なし
  1252.  
  1253.  
  1254.         @xproc    [ SetForceEject ] {
  1255.             movem.l    d1-d7/a0-a6,-(sp)
  1256.  
  1257.             ToSuper
  1258.  
  1259.             * 強制イジェクトフラグを設定
  1260.             tst.b    @ReqForceEject0(a6)
  1261.             @ifst    {
  1262.                 moveq.l    #0,d1
  1263.                 move.l    @KeepDEVHPtr(a6),a1
  1264.                 lea    __DEVD_HOOK-__SUSIEDEVH(a1),a1
  1265.                 moveq.l    #SDDCALL_SetForceEjectSDD,d0
  1266.                 jsr    (a1)
  1267.             }
  1268.             tst.b    @ReqForceEject1(a6)
  1269.             @ifst    {
  1270.                 moveq.l    #1,d1
  1271.                 move.l    @KeepDEVHPtr(a6),a1
  1272.                 lea    __DEVD_HOOK-__SUSIEDEVH(a1),a1
  1273.                 moveq.l    #SDDCALL_SetForceEjectSDD,d0
  1274.                 jsr    (a1)
  1275.             }
  1276.  
  1277.           ?_Quit::
  1278.             ToUser
  1279.             movem.l    (sp)+,d1-d7/a0-a6
  1280.             rts
  1281.         }
  1282.  
  1283.  
  1284. *************************************************************************
  1285.  
  1286.  
  1287. *    void    SetForceProtect( void );
  1288. *
  1289. *        強制プロテクトフラグを設定する。
  1290. *        in    なし
  1291. *        out    なし
  1292.  
  1293.  
  1294.         @xproc    [ SetForceProtect ] {
  1295.             movem.l    d1-d7/a0-a6,-(sp)
  1296.  
  1297.             ToSuper
  1298.  
  1299.             * 強制プロテクトフラグを設定
  1300.             tst.b    @ReqForceProtect0(a6)
  1301.             @ifst    {
  1302.                 moveq.l    #0,d1
  1303.                 move.l    @KeepDEVHPtr(a6),a1
  1304.                 lea    __DEVD_HOOK-__SUSIEDEVH(a1),a1
  1305.                 moveq.l    #SDDCALL_SetForceProtectSDD,d0
  1306.                 jsr    (a1)
  1307.             }
  1308.             tst.b    @ReqForceProtect1(a6)
  1309.             @ifst    {
  1310.                 moveq.l    #1,d1
  1311.                 move.l    @KeepDEVHPtr(a6),a1
  1312.                 lea    __DEVD_HOOK-__SUSIEDEVH(a1),a1
  1313.                 moveq.l    #SDDCALL_SetForceProtectSDD,d0
  1314.                 jsr    (a1)
  1315.             }
  1316.  
  1317.           ?_Quit::
  1318.             ToUser
  1319.             movem.l    (sp)+,d1-d7/a0-a6
  1320.             rts
  1321.         }
  1322.  
  1323.  
  1324. *************************************************************************
  1325.  
  1326.  
  1327. *    void    SetSpOptionBuf( void );
  1328. *
  1329. *        特殊オプションバッファを設定する。
  1330. *        in    なし
  1331. *        out    なし
  1332.  
  1333.  
  1334.         @xproc    [ SetSpOptionBuf ] {
  1335.             movem.l    d1-d7/a0-a6,-(sp)
  1336.  
  1337.             lea    @SpOptionBuf(a6),a1
  1338.  
  1339.             * 98用オプション設定
  1340.             tst.b    @98C_Option(a6)
  1341.             @ifst    {
  1342.                 move.l    #'98:C',(a1)+
  1343.                 move.l    @98C_Param(a6),(a1)+
  1344.             }
  1345.  
  1346.             * SCSI IDオプション設定
  1347.             moveq.l    #0,d0
  1348.             move.l    @CmdSCSI_ID(a6),d0
  1349.             @ifpl    {
  1350.                 move.l    #'SID:',(a1)+
  1351.                 move.l    d0,(a1)+
  1352.             }
  1353.  
  1354.             * Force Ejectオプション設定
  1355.             tst.b    @ReqForceEject1(a6)
  1356.             @ifst    {
  1357.                 moveq.l    #1,d0
  1358.                 move.l    #'EJE:',(a1)+
  1359.                 move.l    d0,(a1)+
  1360.             }
  1361.             tst.b    @ReqForceEject0(a6)
  1362.             @ifst    {
  1363.                 moveq.l    #0,d0
  1364.                 move.l    #'EJE:',(a1)+
  1365.                 move.l    d0,(a1)+
  1366.             }
  1367.  
  1368.             * Force Protectオプション設定
  1369.             tst.b    @ReqForceProtect1(a6)
  1370.             @ifst    {
  1371.                 moveq.l    #1,d0
  1372.                 move.l    #'WPR:',(a1)+
  1373.                 move.l    d0,(a1)+
  1374.             }
  1375.             tst.b    @ReqForceProtect0(a6)
  1376.             @ifst    {
  1377.                 moveq.l    #0,d0
  1378.                 move.l    #'WPR:',(a1)+
  1379.                 move.l    d0,(a1)+
  1380.             }
  1381.  
  1382.             * Wait Busyオプション設定
  1383.             tst.b    @ReqWaitBusy1(a6)
  1384.             @ifst    {
  1385.                 moveq.l    #1,d0
  1386.                 move.l    #'BSY:',(a1)+
  1387.                 move.l    d0,(a1)+
  1388.             }
  1389.             tst.b    @ReqWaitBusy0(a6)
  1390.             @ifst    {
  1391.                 moveq.l    #0,d0
  1392.                 move.l    #'BSY:',(a1)+
  1393.                 move.l    d0,(a1)+
  1394.             }
  1395.  
  1396.             * Hard Verifyオプション設定
  1397.             tst.b    @ReqHardVerify3(a6)
  1398.             @ifst    {
  1399.                 moveq.l    #3,d0
  1400.                 move.l    #'HVF:',(a1)+
  1401.                 move.l    d0,(a1)+
  1402.             }
  1403.             tst.b    @ReqHardVerify2(a6)
  1404.             @ifst    {
  1405.                 moveq.l    #2,d0
  1406.                 move.l    #'HVF:',(a1)+
  1407.                 move.l    d0,(a1)+
  1408.             }
  1409.             tst.b    @ReqHardVerify1(a6)
  1410.             @ifst    {
  1411.                 moveq.l    #1,d0
  1412.                 move.l    #'HVF:',(a1)+
  1413.                 move.l    d0,(a1)+
  1414.             }
  1415.             tst.b    @ReqHardVerify0(a6)
  1416.             @ifst    {
  1417.                 moveq.l    #0,d0
  1418.                 move.l    #'HVF:',(a1)+
  1419.                 move.l    d0,(a1)+
  1420.             }
  1421.  
  1422.             * 高速認識オプション設定
  1423.             tst.b    @ReqAllowRezeroUnit1(a6)
  1424.             @ifst    {
  1425.                 moveq.l    #1,d0
  1426.                 move.l    #'REZ:',(a1)+
  1427.                 move.l    d0,(a1)+
  1428.             }
  1429.             tst.b    @ReqAllowRezeroUnit0(a6)
  1430.             @ifst    {
  1431.                 moveq.l    #0,d0
  1432.                 move.l    #'REZ:',(a1)+
  1433.                 move.l    d0,(a1)+
  1434.             }
  1435.  
  1436.             * Read/Write EXTオプション設定
  1437.             tst.b    @ReqTestRWEXT1(a6)
  1438.             @ifst    {
  1439.                 moveq.l    #1,d0
  1440.                 move.l    #'RWE:',(a1)+
  1441.                 move.l    d0,(a1)+
  1442.             }
  1443.             tst.b    @ReqTestRWEXT0(a6)
  1444.             @ifst    {
  1445.                 moveq.l    #0,d0
  1446.                 move.l    #'RWE:',(a1)+
  1447.                 move.l    d0,(a1)+
  1448.             }
  1449.  
  1450.             * Eject監視間隔オプション設定
  1451.             tst.b    @TE_Option(a6)
  1452.             @ifst    {
  1453.                 move.l    #'TEJ:',(a1)+
  1454.                 move.l    @TE_Param(a6),(a1)+
  1455.             }
  1456.  
  1457.             * リトライ待ち時間オプション設定
  1458.             tst.b    @TW_Option(a6)
  1459.             @ifst    {
  1460.                 move.l    #'TWA:',(a1)+
  1461.                 move.l    @TW_Param(a6),(a1)+
  1462.             }
  1463.  
  1464.             * Insert監視間隔オプション設定
  1465.             tst.b    @TI_Option(a6)
  1466.             @ifst    {
  1467.                 move.l    #'TIN:',(a1)+
  1468.                 move.l    @TI_Param(a6),(a1)+
  1469.             }
  1470.  
  1471.             * Resourceオプション設定
  1472.             tst.b    @ReqBrowseResource1(a6)
  1473.             @ifst    {
  1474.                 moveq.l    #1,d0
  1475.                 move.l    #'BRS:',(a1)+
  1476.                 move.l    d0,(a1)+
  1477.             }
  1478.             tst.b    @ReqBrowseResource0(a6)
  1479.             @ifst    {
  1480.                 moveq.l    #0,d0
  1481.                 move.l    #'BRS:',(a1)+
  1482.                 move.l    d0,(a1)+
  1483.             }
  1484.  
  1485.             * PlayAudioオプション設定
  1486.             tst.b    @ReqSendPlayAudioAdr1(a6)
  1487.             @ifst    {
  1488.                 moveq.l    #1,d0
  1489.                 move.l    #'PAA:',(a1)+
  1490.                 move.l    d0,(a1)+
  1491.             }
  1492.             tst.b    @ReqSendPlayAudioAdr0(a6)
  1493.             @ifst    {
  1494.                 moveq.l    #0,d0
  1495.                 move.l    #'PAA:',(a1)+
  1496.                 move.l    d0,(a1)+
  1497.             }
  1498.  
  1499.             clr.l    (a1)
  1500.  
  1501.           ?_Quit::
  1502.             movem.l    (sp)+,d1-d7/a0-a6
  1503.             rts
  1504.         }
  1505.  
  1506.  
  1507. *************************************************************************
  1508.  
  1509.  
  1510. *    void    GetSpOptionBuf( void );
  1511. *
  1512. *        特殊オプションバッファのデータを解析する。
  1513. *        in    なし
  1514. *        out    なし
  1515.  
  1516.  
  1517.         @xproc    [ GetSpOptionBuf ] {
  1518.             movem.l    d1-d7/a0-a6,-(sp)
  1519.  
  1520.             lea    @SpOptionBuf(a6),a1
  1521.             @do {
  1522.                 move.l    (a1)+,d0
  1523.                 @break.eq;
  1524.                 @switch [ d0 ].l {
  1525.                   @case    #'SID:':
  1526.                     move.l    (a1),d0
  1527.                     move.l    @CmdSCSI_ID(a6),d1
  1528.                     @ifmi    {
  1529.                         move.l    d0,d1
  1530.                     }
  1531.                     move.w    @CmdSCSI_LUN(a6),d0
  1532.                     @ifpl    {
  1533.                         swap    d0
  1534.                         move.w    d1,d0
  1535.                         move.l    d0,d1
  1536.                     } @else {
  1537.                         move.l    d1,d0
  1538.                         swap    d0
  1539.                         move.w    d0,@CmdSCSI_LUN(a6)
  1540.                     }
  1541.                     move.l    d1,@CmdSCSI_ID(a6)
  1542.                     @break;
  1543.                   @case    #'EJE:':
  1544.                     tst.l    (a1)
  1545.                     sst.b    @Status_E(a6)
  1546.                     @break;
  1547.                   @case    #'WPR:':
  1548.                     tst.l    (a1)
  1549.                     sst.b    @Status_W(a6)
  1550.                     @break;
  1551.                   @case    #'HVF:':
  1552.                     move.l    (a1),d0
  1553.                     move.b    d0,@Status_V(a6)
  1554.                     @break;
  1555.                   @case    #'REZ:':
  1556.                     tst.l    (a1)
  1557.                     sst.b    @Status_H(a6)
  1558.                     @break;
  1559.                   @case    #'BSY:':
  1560.                     tst.l    (a1)
  1561.                     sst.b    @Status_B(a6)
  1562.                     @break;
  1563.                   @case    #'TEJ:':
  1564.                     move.l    (a1),@Status_TE(a6)
  1565.                     @break;
  1566.                   @case    #'TWA:':
  1567.                     move.l    (a1),@Status_TW(a6)
  1568.                     @break;
  1569.                   @case    #'TIN:':
  1570.                     move.l    (a1),@Status_TI(a6)
  1571.                     @break;
  1572.                   @case    #'BRS:':
  1573.                     tst.l    (a1)
  1574.                     sst.b    @Status_RB(a6)
  1575.                     @break;
  1576.                 }
  1577.                 addq.w    #4,a1
  1578.             } @while.t;
  1579.  
  1580.           ?_Quit::
  1581.             movem.l    (sp)+,d1-d7/a0-a6
  1582.             rts
  1583.         }
  1584.  
  1585.  
  1586. *************************************************************************
  1587.  
  1588.  
  1589. *    void    ClrSpOptionBuf( void );
  1590. *
  1591. *        特殊オプションバッファのデータをクリアする。
  1592. *        in    なし
  1593. *        out    なし
  1594.  
  1595.  
  1596.         @xproc    [ ClrSpOptionBuf ] {
  1597.             movem.l    d1-d7/a0-a6,-(sp)
  1598.  
  1599.             lea    @SpOptionBuf(a6),a1
  1600.             clr.l    (a1)
  1601.  
  1602.             clr.b    @Status_E(a6)
  1603.             clr.b    @Status_W(a6)
  1604.             clr.b    @Status_V(a6)
  1605.             clr.b    @Status_B(a6)
  1606.             clr.b    @Status_H(a6)
  1607.             clr.l    @Status_TI(a6)
  1608.             clr.l    @Status_TE(a6)
  1609.             clr.l    @Status_TW(a6)
  1610.  
  1611.           ?_Quit::
  1612.             movem.l    (sp)+,d1-d7/a0-a6
  1613.             rts
  1614.         }
  1615.  
  1616.  
  1617. *************************************************************************
  1618.  
  1619.  
  1620. *    void    REPLACEFREEDRIVE( void );
  1621. *
  1622. *        @CmdDrvの"@:"を空きドライブに置き換える。
  1623. *        in    なし
  1624. *        out    なし
  1625.  
  1626.  
  1627.         @xproc    [ REPLACEFREEDRIVE ] {
  1628.             movem.l    d1-d7/a0-a6,-(sp)
  1629.  
  1630.             * 現在の接続ドライブを埋める
  1631.             ToSuper
  1632.             lea    @FreeDriveTable(a6),a1
  1633.             lea    @SUBSTKeepBuf(a6),a2
  1634.             moveq.l    #0,d7
  1635.             @repeat [ d6, #26-1 ].q {
  1636.                 pea    @DINF(a6)
  1637.                 move.l    d7,-(sp)
  1638.                 jsr    __AskDrive
  1639.                 addq.w    #8,sp
  1640.                 cmpi.l    #-1,d0
  1641.                 @ifne    {
  1642.                     st.b    (a1)
  1643.                 }
  1644.                 move.l    SSUB_MD(a2),d0
  1645.                 @switch [ d0 ].l {
  1646.                   @case #$50:
  1647.                   @case #$60:
  1648.                     st.b    (a1)
  1649.                 }
  1650.                 addq.w    #1,a1
  1651.                 lea    SizeOfSSUB(a2),a2
  1652.                 addq.b    #1,d7
  1653.             }
  1654.             ToUser
  1655.  
  1656.             * @:を置き換える
  1657.             lea    @CmdDrv(a6),a2
  1658.             @do {
  1659.                 move.b    (a2),d0
  1660.                 @break.eq;
  1661.                 cmpi.b    #'@',d0
  1662.                 bne    ?_Next
  1663.  
  1664.                 lea    @FreeDriveTable(a6),a1
  1665.                 moveq.l    #0,d7
  1666.                 @repeat [ d6, #26-1 ].q {
  1667.                     tst.b    (a1)
  1668.                     @ifcl    {
  1669.                         st.b    (a1)
  1670.                         addi.b    #'A',d7
  1671.                         move.b    d7,(a2)
  1672.                         bra    ?_Next
  1673.                     }
  1674.                     addq.w    #1,a1
  1675.                     addq.b    #1,d7
  1676.                 }
  1677.                 bra    ERROR_NOFREEDRIVE
  1678.               ?_Next::
  1679.                 addq.w    #1,a2
  1680.             } @while.t;
  1681.  
  1682.           ?_Quit::
  1683.             movem.l    (sp)+,d1-d7/a0-a6
  1684.             rts
  1685.         }
  1686.  
  1687.  
  1688.  
  1689. *************************************************************************
  1690.  
  1691.  
  1692. *    void    ASKKEEP( void );
  1693. *
  1694. *        常駐チェック
  1695. *        in    なし
  1696. *        out    なし
  1697.  
  1698.  
  1699.         @xproc    [ ASKKEEP ] {
  1700.             movem.l    d1-d7/a0-a6,-(sp)
  1701.  
  1702.             tst.w    @CmdDrvCnt(a6)
  1703.             beq    ?_Quit
  1704.  
  1705.             ToSuper
  1706.  
  1707.             pea    @DINF(a6)
  1708.             moveq.l    #0,d0
  1709.             move.b    @CmdDrv(a6),d0
  1710.             subi.b    #'A',d0
  1711.             move.l    d0,-(sp)
  1712.             jsr    __AskDrive
  1713.             addq.w    #8,sp
  1714.             tst.l    d0
  1715.             bmi    ?_NonKeep
  1716.  
  1717.             lea    @DINF(a6),a2
  1718.             move.l    DINF_DEVHPtr(a2),a3
  1719.             move.l    DINF_XDPBPtr(a2),a4
  1720.             lea    DEVH_Name(a3),a0
  1721.             lea    DEVH_Name+__SUSIEDEVH,a1
  1722.             cmpm.l    (a0)+,(a1)+
  1723.             bne    ?_NonKeep
  1724.             cmpm.l    (a0)+,(a1)+
  1725.             bne    ?_NonKeep
  1726.  
  1727.           ?_Keep::
  1728.             move.l    a3,@KeepDEVHPtr(a6)
  1729.             st.b    @IsKeep(a6)
  1730.             bra    ?_e
  1731.  
  1732.           ?_NonKeep::
  1733.             clr.b    @IsKeep(a6)
  1734.             bra    ?_e
  1735.  
  1736.           ?_e::
  1737.             ToUser
  1738.  
  1739.           ?_Quit::
  1740.             movem.l    (sp)+,d1-d7/a0-a6
  1741.             rts
  1742.         }
  1743.  
  1744.  
  1745. *************************************************************************
  1746.  
  1747.  
  1748. *    void    INSTALL( void );
  1749. *
  1750. *        常駐処理
  1751. *        in    なし
  1752. *        out    帰らない。_KEEPPRする。
  1753.  
  1754.  
  1755.         @xproc    [ INSTALL ] {
  1756.  
  1757.             ToSuper
  1758.  
  1759.             tst.b    (DeviceInstalled)
  1760.             @ifst    {
  1761.                 st.b    @ReqAllowUnconnect0(a6)
  1762.             }
  1763.             tst.b    @ReqAllowUnconnect1(a6)
  1764.             @ifst    {
  1765.                 clr.b    @ReqAllowUnconnect0(a6)
  1766.             }
  1767.             tst.b    @ReqAllowUnconnect0(a6)
  1768.             @ifcl    {
  1769.                 st.b    @ReqAllowUnconnect1(a6)
  1770.             }
  1771.  
  1772.             tst.w    @CmdDrvCnt(a6)
  1773.             @ifeq    {
  1774.                 tst.l    @CmdSCSI_ID(a6)
  1775.                 bmi    PRINTALLSTATUS
  1776.                 tst.b    @ReqUnkillDriver(a6)
  1777.                 bst    ERROR_NODRIVE_K
  1778.                 bra    ERROR_NODRIVE
  1779.             } @else {
  1780.                 tst.b    @Z_Option(a6)
  1781.                 @ifcl    {
  1782.                     bsr    ASKKEEP
  1783.                     tst.b    @IsKeep(a6)
  1784.                     bst    PRINTSTATUS
  1785.                 }
  1786.             }
  1787.  
  1788.             cmpi.b    #'*',@CmdDrv(a6)
  1789.             @ifeq    {
  1790.                 cmpi.w    #1,@CmdDrvCnt(a6)
  1791.                 bne    ERROR_ASTDRIVE
  1792.             }
  1793.  
  1794.             tst.b    @ReqAllowUnconnect0(a6)
  1795.             @ifst    {
  1796.                 bsr    AskSCSIConnect
  1797.                 tst.l    d0
  1798.                 bne    ERROR_UNCONNECTED
  1799.             }
  1800.  
  1801.             tst.b    @ReqUnkillDriver(a6)
  1802.             @ifcl    {
  1803.                 tst.b    @Z_Option(a6)
  1804.                 @ifcl    {
  1805.                     tst.l    @CmdSCSI_ID(a6)
  1806.                     @ifmi    {
  1807.                         tst.w    @CmdDrvCnt(a6)
  1808.                         bne    PRINTSTATUS
  1809.                     }
  1810.                 }
  1811.                 bsr    KillDriver
  1812.                 tst.l    d0
  1813. *                bst    ERROR_KEPT
  1814.                 bst    PRINTSTATUS
  1815.             }
  1816.  
  1817.             bsr    ClrSpOptionBuf
  1818.             bsr    SetSpOptionBuf
  1819.             lea    @SpOptionBuf(a6),a1
  1820.             moveq.l    #SDDCALL_SetSpecialOptionSDD,d0
  1821.             jsr    __DEVD_HOOK
  1822.  
  1823.             cmpi.b    #'*',@CmdDrv(a6)
  1824.             @ifeq    {
  1825.                 bsr    MakeAST2Drive
  1826.             }
  1827.             bsr    REPLACEFREEDRIVE
  1828.  
  1829.             bsr    ASKKEEP
  1830.             tst.b    @IsKeep(a6)
  1831. *            bst    ERROR_KEPT
  1832.             @ifst    {
  1833.                 tst.b    @ReqForceKillDriver(a6)
  1834.                 bcl    PRINTSTATUS
  1835.             }
  1836.  
  1837.             tst.l    @CmdSCSI_ID(a6)
  1838.             bmi    ERROR_NOSCSIID
  1839.  
  1840.             DOS    _FFLUSH
  1841.  
  1842.             lea    @CmdDrv(a6),a2
  1843.             @do {
  1844.                 moveq.l    #0,d0
  1845.                 move.b    (a2),d0
  1846.                 @break.eq;
  1847.                 pea    @DINF(a6)
  1848.                 subi.b    #'A',d0
  1849.                 move.l    d0,-(sp)
  1850.                 jsr    __AskDrive
  1851.                 addq.w    #8,sp
  1852.                 cmpi.l    #-2,d0
  1853.                 beq    ERROR_NGDRIVE
  1854.                 cmpi.l    #-4,d0
  1855.                 beq    ERROR_NGDRIVE
  1856.                 addq.w    #1,a2
  1857.             } @while.t;
  1858.  
  1859.             move.l    @CmdSCSI_ID(a6),d1
  1860.             move.w    @CmdDrvCnt(a6),d2
  1861.             moveq.l    #0,d3
  1862.             tst.b    @ReqHardVerify1(a6)
  1863.             @ifst    {
  1864.                 bset.l    #0,d3
  1865.             }
  1866.             tst.b    @ReqHardVerify2(a6)
  1867.             @ifst    {
  1868.                 bset.l    #3,d3
  1869.             }
  1870.             tst.b    @ReqHardVerify3(a6)
  1871.             @ifst    {
  1872.                 bset.l    #0,d3
  1873.                 bset.l    #3,d3
  1874.             }
  1875.             tst.b    @ReqTestRWEXT1(a6)
  1876.             @ifst    {
  1877.                 bset.l    #1,d3
  1878.             }
  1879.             tst.b    @ReqWaitBusy1(a6)
  1880.             @ifst    {
  1881.                 bset.l    #2,d3
  1882.             }
  1883.             lea    @CmdDrv(a6),a1
  1884.             jsr    InstallSDD
  1885.             tst.l    d0
  1886.             bmi    ERROR_INSTALL
  1887.             move.l    #__SUSIEDEVH,@KeepDEVHPtr(a6)
  1888.  
  1889.  .if 0
  1890.             bsr    SetForceEject
  1891.             bsr    SetForceProtect
  1892.  .endif
  1893.  
  1894.             ToUser
  1895.  
  1896.             tst.b    @SI_Option(a6)
  1897.             @ifcl    {
  1898.                 tst.b    @I_Option(a6)
  1899.                 @ifst    {
  1900.                     bsr    PrintStatus2Start
  1901.                     bsr    PrintStatus2
  1902.                 } @else {
  1903.                     bsr    PrintStatusStart
  1904.                     bsr    PrintStatus
  1905.                 }
  1906.             }
  1907.             bsr    PrintInstall
  1908.  
  1909.           ?_Keep::
  1910.             move.b    @MediaID(a6),d0
  1911.             @switch [ d0 ].b {
  1912.               @case #$F5:
  1913.                 tst.l    @C_Param(a6)
  1914.                 @ifeq    {
  1915.                     move.l    #16,@C_Param(a6)
  1916.                 }
  1917.                 @break;
  1918.             }
  1919.  
  1920.             bsr    RemainSubst
  1921.  
  1922.             tst.b    (DeviceInstalled)
  1923.             bst    DDD_INSTALL_OK_Quit
  1924.  
  1925.             * この先常駐終了まで割り込み禁止
  1926.             ToSuper
  1927.             ori.w    #$700,sr
  1928.  
  1929.             lea    KEEPEND,a1
  1930.             lea    PSTART,a2
  1931.             suba.l    a2,a1
  1932.             move.l    @C_Param(a6),d0
  1933.             @ifne    {
  1934.                 jsr    SetBufferSize
  1935.                 add.l    d0,a1
  1936.             }
  1937.             clr.w    -(sp)
  1938.             move.l    a1,-(sp)
  1939.             DOS    _KEEPPR
  1940.  
  1941.         }
  1942.  
  1943.  
  1944. *************************************************************************
  1945.  
  1946.  
  1947. *    void    BusReset( void );
  1948. *
  1949. *        SCSIバスリセットを行なう。
  1950. *        in    なし
  1951. *        out    なし
  1952.  
  1953.  
  1954.         @xproc    [ BusReset ] {
  1955.             movem.l    d1-d7/a0-a6,-(sp)
  1956.  
  1957.             SCSI    _S_RESET
  1958.  
  1959.             movem.l    (sp)+,d1-d7/a0-a6
  1960.             rts
  1961.         }
  1962.  
  1963.  
  1964. *************************************************************************
  1965.  
  1966.  
  1967. *    void    AskSCSIConnect( void );
  1968. *
  1969. *        SCSI機器の接続を調べる。
  1970. *        in    なし
  1971. *        out    d0    0で接続OK
  1972. *                1で未接続
  1973. *                2でSUSIE使用不能
  1974.  
  1975.  
  1976.         @xproc    [ AskSCSIConnect ] {
  1977.             movem.l    d1-d7/a0-a6,-(sp)
  1978.             ToSuper
  1979.  
  1980.             move.l    @CmdSCSI_ID(a6),d4
  1981.             andi.l    #$0007ffff,d4
  1982.             tst.b    @ReqAllowRezeroUnit1(a6)
  1983.             @ifst    {
  1984.                 moveq.l    #1,d3
  1985.                 SCSI    _S_REZEROUNIT
  1986.             }
  1987.             SCSI    _S_TESTUNIT
  1988.  
  1989.           ?_RetryTestUnit::
  1990.             SCSI    _S_TESTUNIT
  1991.             tst.l    d0
  1992.             bmi    ?_Unconnected
  1993.             @ifne    {
  1994.                 tst.b    @ReqWaitBusy1(a6)
  1995.                 @ifst    {
  1996.                     @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  1997.                         [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  1998.                       ?_RetryTestUnit_Request::
  1999.                         moveq.l    #$0e,d3
  2000.                         lea    @SCSI_REQUESTBuf(a6),a1
  2001.                         SCSI    _S_REQUEST
  2002.                         cmpi.l    #SCSI_BUSYCODE,d0
  2003.                         beq    ?_RetryTestUnit_Request
  2004.                         cmpi.l    #SCSI_REQCODE,d0
  2005.                         beq    ?_RetryTestUnit_Request
  2006.                         tst.l    d0
  2007.                         bne    ?_Unconnected
  2008.                         moveq.l    #0,d0
  2009.                         move.b    2(a1),d0
  2010.                         andi.w    #$000f,d0
  2011.                         beq    ?_OKTestUnit
  2012.                         cmpi.w    #1,d0
  2013.                         beq    ?_OKTestUnit
  2014.                         cmpi.w    #2,d0
  2015.                         beq    ?_OKTestUnit
  2016.                         cmpi.w    #6,d0
  2017.                         beq    ?_RetryTestUnit
  2018.                         bra    ?_Unconnected
  2019.                     }
  2020.                 }
  2021.             }
  2022.           ?_OKTestUnit::
  2023.  
  2024.           ?_RetryInquiry::
  2025.             lea    @SCSI_INQUIRYBuf(a6),a1
  2026.             move.l    #$24,d3
  2027.             SCSI    _S_INQUIRY
  2028.             tst.l    d0
  2029.             bmi    ?_Unconnected
  2030.             @ifne    {
  2031.                 tst.b    @ReqWaitBusy1(a6)
  2032.                 @ifst    {
  2033.                     @if [ cmpi.l #SCSI_BUSYCODE,d0 ].eq @or
  2034.                         [ cmpi.l #SCSI_REQCODE,d0 ].eq {
  2035.                       ?_RetryInquiry_Request::
  2036.                         moveq.l    #$0e,d3
  2037.                         lea    @SCSI_REQUESTBuf(a6),a1
  2038.                         SCSI    _S_REQUEST
  2039.                         cmpi.l    #SCSI_BUSYCODE,d0
  2040.                         beq    ?_RetryInquiry_Request
  2041.                         cmpi.l    #SCSI_REQCODE,d0
  2042.                         beq    ?_RetryInquiry_Request
  2043.                         tst.l    d0
  2044.                         bne    ?_Unconnected
  2045.                         moveq.l    #0,d0
  2046.                         move.b    2(a1),d0
  2047.                         andi.w    #$000f,d0
  2048.                         beq    ?_OKInquiry
  2049.                         cmpi.w    #1,d0
  2050.                         beq    ?_OKInquiry
  2051.                         cmpi.w    #2,d0
  2052.                         beq    ?_OKInquiry
  2053.                         cmpi.w    #6,d0
  2054.                         beq    ?_RetryInquiry
  2055.                         bra    ?_Unconnected
  2056.                     }
  2057.                 }
  2058.             }
  2059.           ?_OKInquiry::
  2060.             move.b    0(a1),d0
  2061.             andi.b    #$1f,d0
  2062.             @switch [ d0 ].b {
  2063.               @case    #$00:
  2064.               @case    #$05:
  2065.               @case    #$07:
  2066.                 @break;
  2067.               @default:
  2068.                 bra    ?_UnusableSUSIE
  2069.             }
  2070.             moveq.l    #0,d1
  2071.             bra    ?_e
  2072.  
  2073.           ?_Unconnected::
  2074.             moveq.l    #1,d1
  2075.             bra    ?_e
  2076.  
  2077.           ?_UnusableSUSIE::
  2078.             moveq.l    #2,d1
  2079.             bra    ?_e
  2080.  
  2081.           ?_e::
  2082.             ToUser
  2083.             move.l    d1,d0
  2084.             movem.l    (sp)+,d1-d7/a0-a6
  2085.             rts
  2086.         }
  2087.  
  2088.  
  2089. *************************************************************************
  2090.  
  2091.  
  2092. *    void    KillDriver( void );
  2093. *
  2094. *        すでに常駐しているSCSIドライバを切る。
  2095. *        in    なし
  2096. *        out    d0    最終的にSUSIEが常駐していれば!0
  2097.  
  2098.  
  2099.         @xproc    [ KillDriver ] {
  2100.             movem.l    d1-d7/a0-a6,-(sp)
  2101.             ToSuper
  2102.  
  2103.             * バックアップ
  2104.             lea    @CmdDrv(a6),a1
  2105.             lea    @CmdDrvBack(a6),a2
  2106.             StrCpy    (a1)+,(a2)+
  2107.             move.w    @CmdDrvCnt(a6),@CmdDrvCntBack(a6)
  2108.  
  2109.             * ドライバを切る
  2110.             bsr    MakeID2Drive
  2111.             tst.w    @CmdDrvCnt(a6)
  2112.             beq    @f
  2113.             moveq.l    #0,d0
  2114.             move.b    @CmdDrv(a6),d0
  2115.             subi.b    #'A',d0
  2116.             pea    @DINF(a6)
  2117.             move.l    d0,-(sp)
  2118.             jsr    __AskDrive
  2119.             addq.w    #8,sp
  2120.             move.l    DINF_DEVHPtr+@DINF(a6),a0
  2121.             lea    DEVH_Name(a0),a0
  2122.             lea    DEVH_Name+__SUSIEDEVH,a1
  2123.             cmpm.l    (a0)+,(a1)+
  2124.             bne    @f
  2125.             cmpm.l    (a0)+,(a1)+
  2126.             bne    @f
  2127.             tst.b    @ReqForceKillDriver(a6)
  2128.             @ifcl    {
  2129.                 moveq.l    #-1,d1
  2130.                 bra    ?_Skip
  2131.             }
  2132.           @@:
  2133.             lea    @CmdDrv(a6),a1
  2134.             @do {
  2135.                 moveq.l    #0,d0
  2136.                 move.b    (a1)+,d0
  2137.                 @break.eq;
  2138.                 subi.b    #'A',d0
  2139.                 pea    @DINF(a6)
  2140.                 move.l    d0,-(sp)
  2141.                 jsr    __UnregistDrive
  2142.                 addq.w    #8,sp
  2143.             } @while.t;
  2144.             moveq.l    #0,d1
  2145.  
  2146.           ?_Skip::
  2147.             * バックアップを復元
  2148.             lea    @CmdDrv(a6),a1
  2149.             lea    @CmdDrvBack(a6),a2
  2150.             StrCpy    (a2)+,(a1)+
  2151.             move.w    @CmdDrvCntBack(a6),@CmdDrvCnt(a6)
  2152.  
  2153.             ToUser
  2154.             move.l    d1,d0
  2155.             movem.l    (sp)+,d1-d7/a0-a6
  2156.             rts
  2157.         }
  2158.  
  2159.  
  2160. *************************************************************************
  2161.  
  2162.  
  2163. *    void    InitializeKeepSUSIE( void );
  2164. *
  2165. *        常駐している全SUSIEに初期化を与える。
  2166. *        in    なし
  2167. *        out    なし
  2168.  
  2169.  
  2170.         @xproc    [ InitializeKeepSUSIE ] {
  2171.             movem.l    d1-d7/a0-a6,-(sp)
  2172.  
  2173.             ToSuper
  2174.  
  2175.             * デバイスドライバ先頭をポイント
  2176.             lea    $6800,a2
  2177.             @repeat [ d0, #($10000-6800)/2-1 ].w {
  2178.                 cmpi.l    #'NUL ',(a2)
  2179.                 beq    ?_Found
  2180.                 addq.l    #2,a2
  2181.             }
  2182.             bra    ?_e
  2183.  
  2184.           ?_Found::
  2185.             lea    -$0e(a2),a2
  2186.  
  2187.             * SUSIEを探す
  2188.             @do {
  2189.                 cmpi.l    #$012a5355,$0e(a2)    * $01,'*SU'
  2190.                 bne    ?_NotSUSIE
  2191.                 cmpi.l    #$5349452a,$12(a2)    * 'SIE*'
  2192.                 bne    ?_NotSUSIE
  2193.  
  2194.                 * SUSIEに初期化を送る
  2195.                 lea    __DEVD_HOOK-__SUSIEDEVH(a2),a1
  2196.                 moveq.l    #0,d1
  2197.                 moveq.l    #SDDCALL_CalibrateSDD,d0
  2198.                 jsr    (a1)
  2199.  
  2200.               ?_NotSUSIE::
  2201.                 * リンクを辿って探す
  2202.                 move.l    DEVH_NextDEVHPtr(a2),d0
  2203.                 @break.mi;
  2204.                 move.l    d0,a2
  2205.             } @while.t;
  2206.  
  2207.           ?_e::
  2208.             ToUser
  2209.  
  2210.           ?_Quit::
  2211.             movem.l    (sp)+,d1-d7/a0-a6
  2212.             rts
  2213.         }
  2214.  
  2215.  
  2216. *************************************************************************
  2217.  
  2218.  
  2219. *    void    CHANGESTATUS( void );
  2220. *
  2221. *        常駐変更処理
  2222. *        in    なし
  2223. *        out    帰らない。_EXITする。
  2224.  
  2225.  
  2226.         @xproc    [ CHANGESTATUS ] {
  2227.  
  2228.             ToSuper
  2229.  
  2230.             tst.w    @CmdDrvCnt(a6)
  2231.             beq    ERROR_NODRIVE
  2232.  
  2233.             bsr    ASKKEEP
  2234.             tst.b    @IsKeep(a6)
  2235.             bcl    ERROR_NONKEEP
  2236.  
  2237.             DOS    _FFLUSH
  2238.  
  2239.             bsr    ClrSpOptionBuf
  2240.             lea    @SpOptionBuf(a6),a1
  2241.             move.l    @KeepDEVHPtr(a6),a0
  2242.             lea    __DEVD_HOOK-__SUSIEDEVH(a0),a0
  2243.             moveq.l    #SDDCALL_GetSpecialOptionSDD,d0
  2244.             jsr    (a0)
  2245.             bsr    GetSpOptionBuf
  2246.             bsr    SetSpOptionBuf
  2247.             lea    @SpOptionBuf(a6),a1
  2248.             move.l    @KeepDEVHPtr(a6),a0
  2249.             lea    __DEVD_HOOK-__SUSIEDEVH(a0),a0
  2250.             moveq.l    #SDDCALL_SetSpecialOptionSDD,d0
  2251.             jsr    (a0)
  2252.             moveq.l    #SDDCALL_CalibrateSDD,d0
  2253.             jsr    (a0)
  2254.  
  2255.  .if 0
  2256.             bsr    SetForceEject
  2257.             bsr    SetForceProtect
  2258.  .endif
  2259.  
  2260.             ToUser
  2261.  
  2262.             tst.b    @SI_Option(a6)
  2263.             @ifcl    {
  2264.                 tst.b    @I_Option(a6)
  2265.                 @ifst    {
  2266.                     bsr    PrintStatus2Start
  2267.                     bsr    PrintStatus2
  2268.                 } @else {
  2269.                     bsr    PrintStatusStart
  2270.                     bsr    PrintStatus
  2271.                 }
  2272.             }
  2273.  
  2274.  .if 0
  2275.             pea    [ "CHANGESTATUS:",13,10,0 ](pc)
  2276.             DOS    _PRINT
  2277.             addq.w    #4,sp
  2278.  .endif
  2279.  
  2280.             bsr    RemainSubst
  2281.  
  2282.             tst.b    (DeviceInstalled)
  2283.             bst    DDD_INSTALL_Err_Quit
  2284.  
  2285.             DOS    _EXIT
  2286.         }
  2287.  
  2288.  
  2289. *************************************************************************
  2290.  
  2291.  
  2292. *    void    PRINTSTATUS( void );
  2293. *
  2294. *        ステータス表示処理
  2295. *        in    なし
  2296. *        out    帰らない。_EXITする。
  2297.  
  2298.  
  2299.         @xproc    [ PRINTSTATUS ] {
  2300.  
  2301.             ToSuper
  2302.  
  2303.             tst.w    @CmdDrvCnt(a6)
  2304.             @ifeq    {
  2305.                 tst.l    @CmdSCSI_ID(a6)
  2306.                 bmi    PRINTALLSTATUS
  2307.                 bra    ERROR_NONKEEP
  2308.             }
  2309.             cmpi.b    #'*',@CmdDrv(a6)
  2310.             beq    ERROR_ASTDRIVE
  2311.  
  2312.             bsr    ASKKEEP
  2313.             tst.b    @IsKeep(a6)
  2314.             bcl    ERROR_NONKEEP
  2315.  
  2316.             DOS    _FFLUSH
  2317.  
  2318.             bsr    ClrSpOptionBuf
  2319.             lea    @SpOptionBuf(a6),a1
  2320.             move.l    @KeepDEVHPtr(a6),a0
  2321.             lea    __DEVD_HOOK-__SUSIEDEVH(a0),a0
  2322.             moveq.l    #SDDCALL_GetSpecialOptionSDD,d0
  2323.             jsr    (a0)
  2324.             bsr    GetSpOptionBuf
  2325.             bsr    SetSpOptionBuf
  2326.             lea    @SpOptionBuf(a6),a1
  2327.             move.l    @KeepDEVHPtr(a6),a0
  2328.             lea    __DEVD_HOOK-__SUSIEDEVH(a0),a0
  2329.             moveq.l    #SDDCALL_SetSpecialOptionSDD,d0
  2330.             jsr    (a0)
  2331.             moveq.l    #SDDCALL_CalibrateSDD,d0
  2332.             moveq.l    #0,d1
  2333.             jsr    (a0)
  2334.  .if 0
  2335.             bsr    SetForceEject
  2336.             bsr    SetForceProtect
  2337.  .endif
  2338.  
  2339.             ToUser
  2340.  
  2341.             tst.b    @SI_Option(a6)
  2342.             @ifcl    {
  2343.                 tst.b    @I_Option(a6)
  2344.                 @ifst    {
  2345.                     bsr    PrintStatus2Start
  2346.                     bsr    PrintStatus2
  2347.                 } @else {
  2348.                     bsr    PrintStatusStart
  2349.                     bsr    PrintStatus
  2350.                 }
  2351.             }
  2352.  
  2353.  .if 0
  2354.             pea    [ "PRINTSTATUS:",13,10,0 ](pc)
  2355.             DOS    _PRINT
  2356.             addq.w    #4,sp
  2357.  .endif
  2358.  
  2359.             bsr    RemainSubst
  2360.  
  2361.             tst.b    (DeviceInstalled)
  2362.             bst    DDD_INSTALL_Err_Quit
  2363.  
  2364.             DOS    _EXIT
  2365.         }
  2366.  
  2367.  
  2368. *************************************************************************
  2369.  
  2370.  
  2371. *    void    PRINTALLSTATUS( void );
  2372. *
  2373. *        全ステータス表示処理
  2374. *        in    なし
  2375. *        out    帰らない。_EXITする。
  2376.  
  2377.  
  2378.         @xproc    [ PRINTALLSTATUS ] {
  2379.  
  2380.             DOS    _FFLUSH
  2381.  
  2382.             tst.b    @SI_Option(a6)
  2383.             @ifcl    {
  2384.                 tst.b    @I_Option(a6)
  2385.                 @ifst    {
  2386.                     bsr    PrintStatus2Start
  2387.                     bsr    PrintStatusAll2
  2388.                 } @else {
  2389.                     bsr    PrintStatusStart
  2390.                     bsr    PrintStatusAll
  2391.                 }
  2392.             }
  2393.  
  2394.  .if 0
  2395.             pea    [ "PRINTALLTATUS:",13,10,0 ](pc)
  2396.             DOS    _PRINT
  2397.             addq.w    #4,sp
  2398.  .endif
  2399.  
  2400.             bsr    RemainSubst
  2401.  
  2402.             tst.b    (DeviceInstalled)
  2403.             bst    DDD_INSTALL_Err_Quit
  2404.  
  2405.             DOS    _EXIT
  2406.         }
  2407.  
  2408.  
  2409. *************************************************************************
  2410.  
  2411.  
  2412. *    void    RELEASE( void );
  2413. *
  2414. *        常駐解除処理
  2415. *        in    なし
  2416. *        out    帰らない。_EXITする。
  2417.  
  2418.  
  2419.         @xproc    [ RELEASE ] {
  2420.  
  2421.             tst.w    @CmdDrvCnt(a6)
  2422.             beq    ERROR_NODRIVE
  2423.             cmpi.b    #'*',@CmdDrv(a6)
  2424.             beq    ERROR_ASTDRIVE
  2425.  
  2426.             bsr    ASKKEEP
  2427.             tst.b    @IsKeep(a6)
  2428.             bcl    ERROR_NONKEEP
  2429.  
  2430.             DOS    _FFLUSH
  2431.  
  2432.             ToSuper
  2433.  
  2434.             move.l    @KeepDEVHPtr(a6),a1
  2435.             lea    __DEVD_HOOK-__SUSIEDEVH(a1),a1
  2436.             moveq.l    #SDDCALL_AskReleaseSDD,d0
  2437.             jsr    (a1)
  2438.             move.l    d0,d7
  2439.             tst.l    d0
  2440.             bmi    ERROR_UNRELEASABLE
  2441.  
  2442.             move.l    @KeepDEVHPtr(a6),a1
  2443.             lea    __DEVD_HOOK-__SUSIEDEVH(a1),a1
  2444.             moveq.l    #SDDCALL_ReleaseSDD,d0
  2445.             jsr    (a1)
  2446.  
  2447.             tst.l    d7
  2448.             @ifeq    {
  2449.                 move.l    @KeepDEVHPtr(a6),a1
  2450.                 lea    PSTART-__SUSIEDEVH(a1),a1
  2451.                 pea    -$f0(a1)
  2452.                 DOS    _MFREE
  2453.                 addq.w    #4,sp
  2454.             }
  2455.  
  2456.             ToUser
  2457.  
  2458.             bsr    PrintRelease
  2459.  
  2460.             bsr    RemainSubst
  2461.  
  2462.             tst.b    (DeviceInstalled)
  2463.             bst    DDD_INSTALL_Err_Quit
  2464.  
  2465.             DOS    _EXIT
  2466.  
  2467.         }
  2468.  
  2469.  
  2470. *************************************************************************
  2471.  
  2472.  
  2473. *    void    AskSCSIID( void );
  2474. *
  2475. *        ドライブが使用しているSCSI IDを得る。
  2476. *        in    なし
  2477. *        out    なし
  2478.  
  2479.  
  2480.         @xproc    [ AskSCSIID ] {
  2481.             movem.l    d1-d7/a0-a6,-(sp)
  2482.  
  2483.             ToSuper
  2484.  
  2485.             lea    @DrvSCSIIDTable(a6),a5
  2486.  
  2487.             moveq.l    #0,d7
  2488.             @repeat [ d6, #26-1 ].q {
  2489.                 move.l    #-1,(a5)
  2490.  
  2491.                 pea    @DINF(a6)
  2492.                 move.l    d7,-(sp)
  2493.                 jsr    __AskDrive
  2494.                 addq.w    #8,sp
  2495.                 tst.l    d0
  2496.                 bmi    ?_Next
  2497.  
  2498.                 * ユニット番号を得る
  2499.                 move.l    DINF_XDPBPtr+@DINF(a6),a3
  2500.                 move.b    XDPB_UnitNo(a3),3(a5)
  2501.  
  2502.                 * デバイスヘッダを得る
  2503.                 move.l    DINF_DEVHPtr+@DINF(a6),a2
  2504.  
  2505.                 * デバイスドライバを判別する
  2506.               ?_AskSUSIE::
  2507.                 cmpi.l    #$012a5355,$0e(a2)    * $01,'*SU'
  2508.                 bne    ?_AskSUSIE_e
  2509.                 cmpi.l    #$5349452a,$12(a2)    * 'SIE*'
  2510.                 bne    ?_AskSUSIE_e
  2511.                 lea    __DEVD_HOOK-__SUSIEDEVH(a2),a1
  2512.                 moveq.l    #SDDCALL_AskSDD,d0
  2513.                 jsr    (a1)
  2514.                 ror.w    #8,d0
  2515.                 move.b    d0,2(a5)
  2516.                 swap    d0
  2517.                 andi.w    #$ff,d0
  2518.                 move.w    d0,(a5)
  2519.                 bra    ?_Next
  2520.               ?_AskSUSIE_e::
  2521.  
  2522.               ?_IOCTRL_1::
  2523.                 move.b    XDPB_MediaID(a3),d0
  2524.                 * CD-ROMのMedia ID特殊処理
  2525.                 @if [ cmpi.l #$01434452,$0e(a2) ].eq @and    * $01,'CDR'
  2526.                     [ cmpi.l #$4f4d2020,$12(a2) ].eq {        * 'OM  '
  2527.                     move.b    #$f5,d0
  2528.                 }
  2529.                 @switch [ d0 ].b {
  2530.                   @case #$f5:
  2531.                   @case #$f6:
  2532.                   @case #$f7:
  2533.                     move.l    #8,-(sp)
  2534.                     pea    @IOCTRLBuf(a6)
  2535.                     move.w    d7,d0
  2536.                     addq.w    #1,d0
  2537.                     move.w    d0,-(sp)
  2538.                     move.w    #4,-(sp)
  2539.                     DOS    _IOCTRL
  2540.                     lea    12(sp),sp
  2541.                     tst.l    d0
  2542.                     bne    ?_IOCTRL_1_e
  2543.                     move.b    3+@IOCTRLBuf(a6),d0
  2544.                     ori.b    #$80,d0
  2545.                     move.b    d0,2(a5)
  2546.                     bra    ?_Next
  2547.                 }
  2548.               ?_IOCTRL_1_e::
  2549.  
  2550.               ?_IOCTRL_2::
  2551.                 move.b    XDPB_MediaID(a3),d0
  2552.                 * CD-ROMのMedia ID特殊処理
  2553.                 @if [ cmpi.l #$01434452,$0e(a2) ].eq @and    * $01,'CDR'
  2554.                     [ cmpi.l #$4f4d2020,$12(a2) ].eq {        * 'OM  '
  2555.                     move.b    #$f5,d0
  2556.                 }
  2557.                 @switch [ d0 ].b {
  2558.                   @case #$f5:
  2559.                   @case #$f6:
  2560.                   @case #$f7:
  2561.                     pea    @IOCTRLBuf(a6)
  2562.                     move.w    #$8007,-(sp)
  2563.                     move.w    d7,d0
  2564.                     addq.w    #1,d0
  2565.                     move.w    d0,-(sp)
  2566.                     move.w    #$0d,-(sp)
  2567.                     DOS    _IOCTRL
  2568.                     lea    10(sp),sp
  2569.                     tst.l    d0
  2570.                     bne    ?_IOCTRL_2_e
  2571.                     move.b    3+@IOCTRLBuf(a6),d0
  2572.                     ori.b    #$80,d0
  2573.                     move.b    d0,2(a5)
  2574.                     bra    ?_Next
  2575.                 }
  2576.               ?_IOCTRL_2_e::
  2577.  
  2578.               ?_AskSxSI::
  2579.                 cmpi.l    #$01534348,$0e(a2)    * $01,'SCH'
  2580.                 bne    ?_AskSxSI_e
  2581.                 cmpi.l    #$4449534B,$12(a2)    * 'DISK'
  2582.                 bne    ?_AskSxSI_e
  2583.                 cmpi.l    #'Hero',$18(a2)
  2584.                 bne    ?_AskSxSI5
  2585.                 move.b    $28(a2),d0
  2586.                 ori.b    #$80,d0
  2587.                 move.b    d0,2(a5)
  2588.                 bra    ?_Next
  2589.               ?_AskSxSI_e::
  2590.  
  2591.               ?_AskSxSI5::
  2592.                 cmpi.l    #$01534348,$0e(a2)    * $01,'SCH'
  2593.                 bne    ?_AskSxSI5_e
  2594.                 cmpi.l    #$4449534B,$12(a2)    * 'DISK'
  2595.                 bne    ?_AskSxSI5_e
  2596.                 cmpi.l    #'SxSI',$18(a2)
  2597.                 bne    ?_AskCDROM
  2598.                 move.b    $30(a2),d0
  2599.                 ori.b    #$80,d0
  2600.                 move.b    d0,2(a5)
  2601.                 bra    ?_Next
  2602.               ?_AskSxSI5_e::
  2603.  
  2604.               ?_AskCDROM::
  2605.                 cmpi.l    #$01434452,$0e(a2)    * $01,'CDR'
  2606.                 bne    ?_AskCDROM_e
  2607.                 cmpi.l    #$4f4d2020,$12(a2)    * 'OM  '
  2608.                 bne    ?_AskCDROM_e
  2609.                 move.l    $0a(a2),a0
  2610.                 cmpi.l    #$48e77ffe,$00(a0)    * movem.l d1-d7/a0-a6,-(sp)
  2611.                 bne    ?_AskCDROM_e
  2612.                 cmpi.w    #$4dfa,$04(a0)        * lea.l    ?(pc),a6
  2613.                 bne    ?_AskCDROM_e
  2614.                 cmpi.l    #$2a6e0004,$08(a0)    * movea.l $0004(a6),a5
  2615.                 @ifeq    {
  2616.                     * CDDEV.SYS
  2617.                     move.w    $06(a0),d0
  2618.                     lea    $06(a0,d0.w),a0
  2619.                     move.l    (a0),d0
  2620.                     ori.b    #$80,d0
  2621.                     move.b    d0,2(a5)
  2622.                     bra    ?_Next
  2623.                 }
  2624.                 cmpi.w    #$2a56,$08(a0)        * movea.l (a6),a5
  2625.                 @ifeq    {
  2626.                     * CDDRV.SYS
  2627.                     move.w    $06(a0),d0
  2628.                     lea    $06(a0,d0.w),a0
  2629.                     move.l    $04(a0),d0
  2630.                     ori.b    #$80,d0
  2631.                     move.b    d0,2(a5)
  2632.                     bra    ?_Next
  2633.                 }
  2634.               ?_AskCDROM_e::
  2635.  
  2636.               ?_AskSCHDISK::
  2637.                 cmpi.l    #$01534348,$0e(a2)    * $01,'SCH'
  2638.                 bne    ?_AskSCHDISK_e
  2639.                 cmpi.l    #$4449534B,$12(a2)    * 'DISK'
  2640.                 bne    ?_AskSCHDISK_e
  2641.                 moveq.l    #0,d0
  2642.                 move.w    $74(a2),d0
  2643.                 lea    (a2,d0.l),a0
  2644.                 move.b    $61f(a0),d0
  2645.                 ori.b    #$80,d0
  2646.                 move.b    d0,2(a5)
  2647.                 bra    ?_Next
  2648.               ?_AskSCHDISK_e::
  2649.  
  2650.               ?_Other::
  2651.               ?_Next::
  2652.                 addq.w    #4,a5
  2653.                 addq.w    #1,d7
  2654.             }
  2655.  
  2656.             ToUser
  2657.  
  2658.           ?_Quit::
  2659.             movem.l    (sp)+,d1-d7/a0-a6
  2660.             rts
  2661.         }
  2662.  
  2663.  
  2664. *************************************************************************
  2665.  
  2666.  
  2667. *    void    ABORT( void );
  2668. *
  2669. *        アボート処理
  2670. *        in    なし
  2671. *        out    帰らない。_EXITする。
  2672.  
  2673.  
  2674.         @xproc    [ ABORT ] {
  2675.             lea    BSSSTART,a6
  2676.  
  2677.             pea    [ "ABORTしました。",13,10,0 ](pc)
  2678.             DOS    _PRINT
  2679.             addq.w    #4,sp
  2680.  
  2681.             bsr    RemainSubst
  2682.  
  2683.             tst.b    (DeviceInstalled)
  2684.             bst    DDD_INSTALL_Err_Quit
  2685.  
  2686.             DOS    _EXIT
  2687.         }
  2688.  
  2689.  
  2690. *************************************************************************
  2691.  
  2692.  
  2693. *    void    ERROR( void );
  2694. *
  2695. *        エラー処理
  2696. *        in    なし
  2697. *        out    帰らない。_EXITする。
  2698.  
  2699.  
  2700.         @xproc    [ ERROR ] {
  2701.  
  2702.           ?_MEM::
  2703.             lea    [ "実行に必要なメモリが足りません。",13,10,0 ](pc),a1
  2704.             bra    ?_PRINT
  2705.  
  2706.           ?_INSTALL::
  2707.             lea    [ "SUSIEがインストールできませんでした。",13,10,0 ](pc),a1
  2708.             bra    ?_PRINT
  2709.  
  2710.           ?_KEPT::
  2711.             lea    [ "指定ドライブ(またはSCSI-ID,LUN)にはすでにSUSIEが常駐しています。",13,10,0 ](pc),a1
  2712.             bra    ?_PRINT
  2713.  
  2714.           ?_NONKEEP::
  2715.             lea    [ "指定ドライブ(またはSCSI-ID,LUN)にSUSIEが常駐していません。",13,10,0 ](pc),a1
  2716.             bra    ?_PRINT
  2717.  
  2718.           ?_NODRIVE::
  2719.             lea    [ "ドライブ名を指定してください。",13,10,0 ](pc),a1
  2720.             bra    ?_PRINT
  2721.  
  2722.           ?_NODRIVE_K::
  2723.             lea    [ "指定のSCSI-ID,LUNにはSCSIドライバが登録されていません。",13,10,0 ](pc),a1
  2724.             bra    ?_PRINT
  2725.  
  2726.           ?_NOSCSIID::
  2727.             lea    [ "-IDオプションでSCSI-IDを設定してください。",13,10,0 ](pc),a1
  2728.             bra    ?_PRINT
  2729.  
  2730.           ?_UNRELEASABLE2::
  2731.             lea    [ "CONFIG.SYSで登録したSUSIEは解除できません。",13,10,0 ](pc),a1
  2732.             bra    ?_PRINT
  2733.  
  2734.           ?_NOFREEDRIVE::
  2735.             lea    [ "ドライブの空きがありません。",13,10,0 ](pc),a1
  2736.             bra    ?_PRINT
  2737.  
  2738.           ?_SCSICALL::
  2739.             lea    [ "SCSIボードが装着されていません。",13,10,0 ](pc),a1
  2740.             bra    ?_PRINT
  2741.  
  2742.           ?_ASTDRIVE::
  2743.             lea    [ "*:は使用できません。",13,10,0 ](pc),a1
  2744.             bra    ?_PRINT
  2745.  
  2746.           ?_IDandDRVandUnkill::
  2747.             lea    [ "-IDn -K ?:の形では使用できません。",13,10,0 ](pc),a1
  2748.             bra    ?_PRINT
  2749.  
  2750.           ?_TI_Param::
  2751.             lea    [ "-TIの範囲は1~9999です。",13,10,0 ](pc),a1
  2752.             bra    ?_PRINT
  2753.  
  2754.           ?_TE_Param::
  2755.             lea    [ "-TEの範囲は1~9999です。",13,10,0 ](pc),a1
  2756.             bra    ?_PRINT
  2757.  
  2758.           ?_TW_Param::
  2759.             lea    [ "-TWの範囲は1~9999です。",13,10,0 ](pc),a1
  2760.             bra    ?_PRINT
  2761.  
  2762.           ?_C_Param::
  2763.             lea    [ "-Cの範囲は2~32です。",13,10,0 ](pc),a1
  2764.             bra    ?_PRINT
  2765.  
  2766.           ?_CMD::
  2767.             lea    @ErrMesBuf(a6),a0
  2768.             @do {
  2769.                 move.b    (a3)+,d0
  2770.                 cmpi.b    #' '+1,d0
  2771.                 @break.cs;
  2772.                 move.b    d0,(a0)+
  2773.             } @while.t;
  2774.             lea    [ ": コマンドラインが異常です。",13,10,0 ](pc),a1
  2775.             StrCpy    (a1)+,(a0)+
  2776.             lea    @ErrMesBuf(a6),a1
  2777.             bra    ?_PRINT
  2778.  
  2779.           ?_UNCONNECTED::
  2780.             move.l    d0,d1
  2781.             lea    @ErrMesBuf(a6),a0
  2782.             lea    [ "SCSI-ID",0 ](pc),a1
  2783.             StrCpy    (a1)+,(a0)+
  2784.             subq.w    #1,a0
  2785.             moveq.l    #'0',d0
  2786.             add.l    @CmdSCSI_ID(a6),d0
  2787.             move.b    d0,(a0)+
  2788.             swap    d0
  2789.             cmpi.b    #8,d0
  2790.             @ifcs    {
  2791.                 lea    [ ",LUN",0 ](pc),a1
  2792.                 StrCpy    (a1)+,(a0)+
  2793.                 subq.w    #1,a0
  2794.                 andi.b    #$07,d0
  2795.                 addi.b    #'0',d0
  2796.                 move.b    d0,(a0)+
  2797.             }
  2798.             @switch [ d1 ].b {
  2799.               @case    #2:
  2800.                 lea    [ " はSUSIEで使用できない機器です。",13,10,0 ](pc),a1
  2801.                 @break;
  2802.               @default:
  2803.                 lea    [ " は未接続です。",13,10,0 ](pc),a1
  2804.                 @break;
  2805.             }
  2806.             StrCpy    (a1)+,(a0)+
  2807.             lea    @ErrMesBuf(a6),a1
  2808.             bra    ?_PRINT
  2809.  
  2810.           ?_NGDRIVE::
  2811.             lea    @ErrMesBuf(a6),a0
  2812.             move.b    (a2),(a0)+
  2813.             lea    [ ": ドライブがSUSIE用に使用できません。",13,10,0 ](pc),a1
  2814.             StrCpy    (a1)+,(a0)+
  2815.             lea    @ErrMesBuf(a6),a1
  2816.             bra    ?_PRINT
  2817.  
  2818.           ?_UNRELEASABLE::
  2819.             andi.l    #$ff,d0
  2820.             move.l    d0,-(sp)
  2821.             jsr    __GetLDriveNo
  2822.             addq.w    #4,sp
  2823.             moveq.l    #'A',d1
  2824.             add.b    d0,d1
  2825.             lea    @ErrMesBuf(a6),a0
  2826.             move.b    d1,(a0)+
  2827.             lea    [ "ドライブがSUSIEの管理ではありません。",13,10,0 ](pc),a1
  2828.             StrCpy    (a1)+,(a0)+
  2829.             lea    @ErrMesBuf(a6),a1
  2830.             bra    ?_PRINT
  2831.  
  2832.           ?_PRINT::
  2833.             bsr    PrintMessage
  2834.  
  2835.             bsr    RemainSubst
  2836.  
  2837.             tst.b    (DeviceInstalled)
  2838.             bst    DDD_INSTALL_Err_Quit
  2839.  
  2840.             move.w    #-1,-(sp)
  2841.             DOS    _EXIT2
  2842.         }
  2843.  
  2844.  
  2845. *************************************************************************
  2846.  
  2847.  
  2848. *    void    PrintMessage( void );
  2849. *
  2850. *        メッセージ表示
  2851. *        in    a1    メッセージ文字列
  2852. *        out    なし
  2853.  
  2854.  
  2855.         @xproc    [ PrintMessage ] {
  2856.             @param    [ a1, MessagePtr ].l;
  2857.  
  2858.             move.w    ##STDERR,-(sp)
  2859.             pea    [ "susie.x: ",0 ](pc)
  2860.             DOS    _FPUTS
  2861.             addq.w    #4,sp
  2862.             move.l    MessagePtr,-(sp)
  2863.             DOS    _FPUTS
  2864.             addq.w    #6,sp
  2865.  
  2866.             rts
  2867.         }
  2868.  
  2869.  
  2870. *************************************************************************
  2871.  
  2872.  
  2873. *    void    PrintInstall( void );
  2874. *
  2875. *        インストール表示
  2876. *        in    なし
  2877. *        out    なし
  2878.  
  2879.  
  2880.         @xproc    [ PrintInstall ] {
  2881.  
  2882.             lea    [ "常駐しました。",13,10,0 ](pc),a1
  2883.             bsr    PrintMessage
  2884.             rts
  2885.         }
  2886.  
  2887.  
  2888. *************************************************************************
  2889.  
  2890.  
  2891. *    void    PrintRelease( void );
  2892. *
  2893. *        リリース表示
  2894. *        in    なし
  2895. *        out    なし
  2896.  
  2897.  
  2898.         @xproc    [ PrintRelease ] {
  2899.  
  2900.             lea    [ "常駐解除しました。",13,10,0 ](pc),a1
  2901.             bsr    PrintMessage
  2902.             rts
  2903.         }
  2904.  
  2905.  
  2906. *************************************************************************
  2907.  
  2908.  
  2909. *    void    PrintStatusStart( void );
  2910. *
  2911. *        ステータス表示開始
  2912. *        in    なし
  2913. *        out    なし
  2914.  
  2915.  
  2916.         @xproc    [ PrintStatusStart ] {
  2917.  
  2918.             pea    [
  2919.                 "Drv Driver       Device Name           [RP] (VEWBH) -TI -TE -TW  Size   Volume             ",13,10
  2920.                 "----------------------------------------------------------------------------------------------",13,10
  2921.                 0
  2922.             ](pc)
  2923.             DOS    _PRINT
  2924.             addq.w    #4,sp
  2925.  
  2926.             rts
  2927.         }
  2928.  
  2929.  
  2930. *************************************************************************
  2931.  
  2932.  
  2933. *    void    PrintStatus2Start( void );
  2934. *
  2935. *        ステータス精細表示開始
  2936. *        in    なし
  2937. *        out    なし
  2938.  
  2939.  
  2940.         @xproc    [ PrintStatus2Start ] {
  2941.  
  2942.             pea    [
  2943.                 "Drv Driver       Device Name              Used / Capacity       [RP]   Volume",13,10
  2944.                 "----------------------------------------------------------------------------------------------",13,10
  2945.                 0
  2946.             ](pc)
  2947.             DOS    _PRINT
  2948.             addq.w    #4,sp
  2949.  
  2950.             rts
  2951.         }
  2952.  
  2953.  
  2954. *************************************************************************
  2955.  
  2956.  
  2957. *    void    PrintStatus( void );
  2958. *
  2959. *        ステータス表示
  2960. *        in    なし
  2961. *        out    なし
  2962.  
  2963.  
  2964.         @xproc    [ PrintStatus ] {
  2965.             movem.l    d1-d7/a0-a6,-(sp)
  2966.  
  2967.             bsr    ?_GetSUSIEDeviceInfo
  2968.             bsr    ?_Sub
  2969.  
  2970.             movem.l    (sp)+,d1-d7/a0-a6
  2971.             rts
  2972.  
  2973.           ?_GetSUSIEDeviceInfo::
  2974.             ToSuper
  2975.  
  2976.             * SUSIEのデバイス情報を得る
  2977.             move.l    @KeepDEVHPtr(a6),a1
  2978.             lea    __DEVD_HOOK-__SUSIEDEVH(a1),a1
  2979.             moveq.l    #SDDCALL_AskSDD,d0
  2980.             jsr    (a1)
  2981.             moveq.l    #0,d1
  2982.             move.b    d0,d1
  2983.             move.w    d1,@DrvCnt(a6)
  2984.             rol.w    #8,d0
  2985.             move.l    d1,-(sp)
  2986.             move.w    d0,d1
  2987.             andi.w    #$f0,d1
  2988.             lsr.w    #4,d1
  2989.             swap    d1
  2990.             move.w    d0,d1
  2991.             andi.w    #$0f,d1
  2992.             move.l    d1,@SCSI_ID(a6)
  2993.             move.l    (sp)+,d1
  2994.             swap    d0
  2995.             tst.w    d0
  2996.             @ifpl    {
  2997.                 andi.w    #$ff,d0
  2998.             }
  2999.             move.w    d0,@FormatType(a6)
  3000.             move.l    a1,@DPBTablePtr(a6)
  3001.  
  3002.             ToUser
  3003.             rts
  3004.  
  3005.           ?_Sub::
  3006.             movem.l    d1-d7/a0-a6,-(sp)
  3007.             ToSuper
  3008.  
  3009.             move.l    @DPBTablePtr(a6),a2
  3010.             move.w    @DrvCnt(a6),d7
  3011.             subq.w    #1,d7
  3012.             @repeat [ d7 ].w {
  3013.                 move.l    #$100,d0
  3014.                 move.b    DPBTable_DriveNo(a2),d0
  3015.                 pea    @DINF(a6)
  3016.                 move.l    d0,-(sp)
  3017.                 jsr    __AskDrive
  3018.                 addq.w    #8,sp
  3019.                 tst.l    d0
  3020.                 @continue.mi;
  3021.                 addq.w    #1,d6
  3022.                 move.l    DINF_XDPBPtr+@DINF(a6),a0
  3023.                 move.l    a0,@XDPBPtr(a6)
  3024.                 move.b    XDPB_MediaID(a0),@MediaID(a6)
  3025.                 lea    @MesBuf(a6),a0
  3026.                 bsr    ?_GetLDriveNo
  3027.                 bsr    ?_PutDriveID
  3028.                 bsr    ?_GetDrvCtrl
  3029.                 bsr    ?_PutDrvCtrl
  3030.                 bsr    ?_PutOption
  3031.                 bsr    ?_PutDriveCapaMini
  3032.                 bsr    ?_PutVolume
  3033.                 bsr    ?_Disp
  3034.                 lea    SizeOf1DPBTable(a2),a2
  3035.             }
  3036.  
  3037.             ToUser
  3038.             movem.l    (sp)+,d1-d7/a0-a6
  3039.             rts
  3040.  
  3041.           ?_Sub2::
  3042.             movem.l    d1-d7/a0-a6,-(sp)
  3043.             ToSuper
  3044.  
  3045.             move.l    @DPBTablePtr(a6),a2
  3046.             move.w    @DrvCnt(a6),d7
  3047.             subq.w    #1,d7
  3048.             @repeat [ d7 ].w {
  3049.                 move.l    #$100,d0
  3050.                 move.b    DPBTable_DriveNo(a2),d0
  3051.                 pea    @DINF(a6)
  3052.                 move.l    d0,-(sp)
  3053.                 jsr    __AskDrive
  3054.                 addq.w    #8,sp
  3055.                 tst.l    d0
  3056.                 @continue.mi;
  3057.                 addq.w    #1,d6
  3058.                 move.l    DINF_XDPBPtr+@DINF(a6),a0
  3059.                 move.l    a0,@XDPBPtr(a6)
  3060.                 move.b    XDPB_MediaID(a0),@MediaID(a6)
  3061.                 lea    @MesBuf(a6),a0
  3062.                 bsr    ?_GetLDriveNo
  3063.                 bsr    ?_PutDriveID
  3064.                 bsr    ?_GetDrvCtrl
  3065.                 bsr    ?_PutDriveCapa
  3066.                 bsr    ?_PutDrvCtrl
  3067.                 bsr    ?_PutVolume
  3068.                 bsr    ?_Disp
  3069.                 lea    SizeOf1DPBTable(a2),a2
  3070.             }
  3071.  
  3072.             ToUser
  3073.             movem.l    (sp)+,d1-d7/a0-a6
  3074.             rts
  3075.  
  3076.           ?_Sub3::
  3077.             movem.l    d1-d7/a0-a6,-(sp)
  3078.             ToSuper
  3079.  
  3080.             move.l    @CmdSCSI_ID(a6),@SCSI_ID(a6)
  3081.             lea    @CmdDrv(a6),a1
  3082.             @do {
  3083.                 tst.l    @SCSI_ID(a6)
  3084.                 @ifmi    {
  3085.                     move.w    #SDD_FormatType_X68000,@FormatType(a6)
  3086.                 }
  3087.                 moveq.l    #0,d6
  3088.                 move.b    (a1)+,d6
  3089.                 @break.eq;
  3090.                 pea    @DINF(a6)
  3091.                 subi.b    #'A',d6
  3092.                 move.l    d6,-(sp)
  3093.                 jsr    __AskDrive
  3094.                 addq.w    #8,sp
  3095.                 tst.l    d0
  3096.                 @continue.mi;
  3097.                 addq.w    #1,d6
  3098.                 move.l    DINF_DEVHPtr+@DINF(a6),a0
  3099.                 move.w    DEVH_Flag(a0),d0
  3100.                 move.l    DINF_XDPBPtr+@DINF(a6),a0
  3101.                 move.l    a0,@XDPBPtr(a6)
  3102.                 btst    #13,d0
  3103.                 @ifst    {
  3104.                     clr.w    -(sp)
  3105.                     move.l    sp,-(sp)
  3106.                     clr.w    -(sp)
  3107.                     move.w    d6,-(sp)
  3108.                     move.w    #13,-(sp)
  3109.                     DOS    _IOCTRL
  3110.                     lea    10(sp),sp
  3111.                     move.w    (sp)+,d0
  3112.                     move.b    d0,@MediaID(a6)
  3113.                 } @else {
  3114.                     move.b    XDPB_MediaID(a0),@MediaID(a6)
  3115.                 }
  3116.                 move.l    a1,-(sp)
  3117.                 lea    @MesBuf(a6),a0
  3118.                 bsr    ?_PutDriveID
  3119.                 bsr    ?_GetDrvCtrl
  3120.                 bsr    ?_PutDrvCtrl
  3121.                 bsr    ?_PutOption
  3122.                 bsr    ?_PutDriveCapaMini
  3123.                 bsr    ?_PutVolume
  3124.                 bsr    ?_Disp
  3125.                 move.l    (sp)+,a1
  3126.             } @while.t;
  3127.  
  3128.             ToUser
  3129.             movem.l    (sp)+,d1-d7/a0-a6
  3130.             rts
  3131.  
  3132.           ?_Sub4::
  3133.             movem.l    d1-d7/a0-a6,-(sp)
  3134.             ToSuper
  3135.  
  3136.             move.l    @CmdSCSI_ID(a6),@SCSI_ID(a6)
  3137.             lea    @CmdDrv(a6),a1
  3138.             @do {
  3139.                 tst.l    @SCSI_ID(a6)
  3140.                 @ifmi    {
  3141.                     move.w    #SDD_FormatType_X68000,@FormatType(a6)
  3142.                 }
  3143.                 moveq.l    #0,d6
  3144.                 move.b    (a1)+,d6
  3145.                 @break.eq;
  3146.                 pea    @DINF(a6)
  3147.                 subi.b    #'A',d6
  3148.                 move.l    d6,-(sp)
  3149.                 jsr    __AskDrive
  3150.                 addq.w    #8,sp
  3151.                 tst.l    d0
  3152.                 @continue.mi;
  3153.                 addq.w    #1,d6
  3154.                 move.l    DINF_DEVHPtr+@DINF(a6),a0
  3155.                 move.w    DEVH_Flag(a0),d0
  3156.                 move.l    DINF_XDPBPtr+@DINF(a6),a0
  3157.                 move.l    a0,@XDPBPtr(a6)
  3158.                 btst    #13,d0
  3159.                 @ifst    {
  3160.                     clr.w    -(sp)
  3161.                     move.l    sp,-(sp)
  3162.                     clr.w    -(sp)
  3163.                     move.w    d6,-(sp)
  3164.                     move.w    #13,-(sp)
  3165.                     DOS    _IOCTRL
  3166.                     lea    10(sp),sp
  3167.                     move.w    (sp)+,d0
  3168.                     move.b    d0,@MediaID(a6)
  3169.                 } @else {
  3170.                     move.b    XDPB_MediaID(a0),@MediaID(a6)
  3171.                 }
  3172.                 move.l    a1,-(sp)
  3173.                 lea    @MesBuf(a6),a0
  3174.                 bsr    ?_PutDriveID
  3175.                 bsr    ?_GetDrvCtrl
  3176.                 bsr    ?_PutDriveCapa
  3177.                 bsr    ?_PutDrvCtrl
  3178.                 bsr    ?_PutVolume
  3179.                 bsr    ?_Disp
  3180.                 move.l    (sp)+,a1
  3181.             } @while.t;
  3182.  
  3183.             ToUser
  3184.             movem.l    (sp)+,d1-d7/a0-a6
  3185.             rts
  3186.  
  3187.           ?_GetLDriveNo::
  3188.             * 論理ドライブ名を得る
  3189.             moveq.l    #0,d0
  3190.             move.b    DPBTable_DriveNo(a2),d0
  3191.             move.l    d0,-(sp)
  3192.             jsr    __GetLDriveNo
  3193.             addq.w    #4,sp
  3194.             moveq.l    #0,d6
  3195.             move.b    d0,d6
  3196.             addq.w    #1,d6
  3197.             rts
  3198.  
  3199.           ?_PutDriveID::
  3200.             * ドライブ名とSCSI IDを出力
  3201.             move.b    #' ',(a0)+
  3202.             moveq.l    #'A'-1,d0
  3203.             add.b    d6,d0
  3204.             move.b    d0,(a0)+
  3205.             lea    [ ': ',0 ](pc),a1
  3206.             StrCpy    (a1)+,(a0)+
  3207.             subq.w    #1,a0
  3208.  
  3209.             move.l    @XDPBPtr(a6),a1
  3210.             move.l    XDPB_DEVHPtr(a1),a1
  3211.             lea    1+DEVH_Name(a1),a1
  3212.             @repeat [ d0, #7-1 ].q {
  3213.                 move.b    (a1)+,(a0)+
  3214.             }
  3215.             move.w    @FormatType(a6),d0
  3216.             @switch [ d0 ].w {
  3217.               @case    #SDD_FormatType_X68000:
  3218.                 lea    [ '(X68) ',0 ](pc),a1
  3219.                 tst.l    @SCSI_ID(a6)
  3220.                 @ifmi    {
  3221.                     lea    [ '(---) ',0 ](pc),a1
  3222.                 }
  3223.                 @break;
  3224.               @case    #SDD_FormatType_PC9801:
  3225.                 lea    [ '(NEC) ',0 ](pc),a1
  3226.                 @break;
  3227.               @case    #SDD_FormatType_FMTOWNS:
  3228.                 lea    [ '(FMT) ',0 ](pc),a1
  3229.                 @break;
  3230.               @case    #SDD_FormatType_IBMMO:
  3231.                 lea    [ '(IBM) ',0 ](pc),a1
  3232.                 @break;
  3233.               @case    #SDD_FormatType_IBMFDISK:
  3234.                 lea    [ '(FDI) ',0 ](pc),a1
  3235.                 @break;
  3236.               @case    #SDD_FormatType_ZIP:
  3237.                 lea    [ '(ZIP) ',0 ](pc),a1
  3238.                 @break;
  3239.                                     *---------- TNB
  3240.               @case    #SDD_FormatType_2HD:
  3241.                 lea    [ '(2HD) ',0 ](pc),a1
  3242.                 @break;
  3243.                                     *---------- TNB
  3244.               @case    #SDD_FormatType_ISO9660:
  3245.                 lea    [ '(IS9) ',0 ](pc),a1
  3246.                 @break;
  3247.               @default:
  3248.                 lea    [ '(---) ',0 ](pc),a1
  3249.                 @break;
  3250.             }
  3251.             StrCpy    (a1)+,(a0)+
  3252.             subq.w    #1,a0
  3253.  
  3254.             move.l    @SCSI_ID(a6),d1
  3255.             @ifpl    {
  3256.                 cmpi.b    #10,d1
  3257.                 @ifcc    {
  3258.                     add.b    #'A'-10,d1
  3259.                 } @else {
  3260.                     add.b    #'0',d1
  3261.                 }
  3262.             } @else {
  3263.                 moveq.l    #'?',d1
  3264.                 moveq.l    #0,d1            *** TNB
  3265.                             * 以下、MEDIA ID によって
  3266.                             * SCSI かのチェックをやめて
  3267.                             * ます。でないと 2HD が
  3268.                             * [SUSIE recognizable drive]
  3269.                             * にならないので
  3270.             }
  3271.             move.b    @MediaID(a6),d0
  3272.             @switch [ d0 ].b {
  3273.               @case #$F4:
  3274.                 lea    [ 'SCSI DAT   ',0 ](pc),a1
  3275.                 @break;
  3276.               @case #$F5:
  3277.                 lea    [ 'SCSI CD-ROM',0 ](pc),a1
  3278.                 @break;
  3279.               @case #$F6:
  3280.                 lea    [ 'SCSI MO    ',0 ](pc),a1
  3281.                 @break;
  3282.               @case #$F7:
  3283.                 lea    [ 'SCSI HDD   ',0 ](pc),a1
  3284.                 @break;
  3285.               @case #$F8:
  3286.                 lea    [ 'SASI HDD   ',0 ](pc),a1
  3287.                 *moveq.l    #0,d1            *** TNB
  3288.                 @break;
  3289.               @case #$F9:
  3290.                 lea    [ 'RAM DISK   ',0 ](pc),a1
  3291.                 *moveq.l    #0,d1            *** TNB
  3292.                 @break;
  3293.               @case #$FA:
  3294.                 lea    [ '2HD(1.44MB)',0 ](pc),a1
  3295.                 *moveq.l    #0,d1            *** TNB
  3296.                 @break;
  3297.               @case #$FB:
  3298.                 lea    [ '2DD(640KB) ',0 ](pc),a1
  3299.                 *moveq.l    #0,d1            *** TNB
  3300.                 @break;
  3301.               @case #$FC:
  3302.                 lea    [ '2DD(720KB) ',0 ](pc),a1
  3303.                 *moveq.l    #0,d1            *** TNB
  3304.                 @break;
  3305.               @case #$FD:
  3306.                 lea    [ '2HC(1MB)   ',0 ](pc),a1
  3307.                 *moveq.l    #0,d1            *** TNB
  3308.                 @break;
  3309.               @case #$FE:
  3310.                 lea    [ '2HD(1MB)   ',0 ](pc),a1
  3311.                 *moveq.l    #0,d1            *** TNB
  3312.                 @break;
  3313.               @case #$FF:
  3314.                 lea    [ 'SCSI(void) ',0 ](pc),a1
  3315.                 tst.l    @SCSI_ID(a6)
  3316.                 @ifmi    {
  3317.                     lea    [ 'Other      ',0 ](pc),a1
  3318.                     moveq.l    #0,d1
  3319.                 }
  3320.                 @break;
  3321.               @default:
  3322.                 lea    [ 'Other      ',0 ](pc),a1
  3323.                 moveq.l    #0,d1
  3324.                 @break;
  3325.             }
  3326.             StrCpy    (a1)+,(a0)+
  3327.             subq.w    #1,a0
  3328.             tst.b    d1
  3329.             @ifne    {
  3330.                 move.l    d1,d0
  3331.                 swap    d0
  3332.                 cmpi.b    #8,d0
  3333.                 @ifcc    {
  3334.                     lea    [ '(ID',0 ](pc),a1
  3335.                     StrCpy    (a1)+,(a0)+
  3336.                     subq.w    #1,a0
  3337.                     move.b    d1,(a0)+
  3338.                     lea    [ '  ,U',0 ](pc),a1
  3339.                 } @else {
  3340.                     addi.b    #'0',d0
  3341.                     lea    [ '(ID',0 ](pc),a1
  3342.                     StrCpy    (a1)+,(a0)+
  3343.                     subq.w    #1,a0
  3344.                     move.b    d1,(a0)+
  3345.                     move.b    #'L',(a0)+
  3346.                     move.b    d0,(a0)+
  3347.                     lea    [ ',U',0 ](pc),a1
  3348.                 }
  3349.             } @else {
  3350.                 lea    [ '(-----,U',0 ](pc),a1
  3351.             }
  3352.             StrCpy    (a1)+,(a0)+
  3353.             subq.w    #1,a0
  3354.             move.l    @XDPBPtr(a6),a1
  3355.             moveq.l    #'0',d0
  3356.             add.b    XDPB_UnitNo(a1),d0
  3357.             move.b    d0,(a0)+
  3358.             lea    [ ') ',0 ](pc),a1
  3359.             StrCpy    (a1)+,(a0)+
  3360.             subq.w    #1,a0
  3361.             rts
  3362.  
  3363.           ?_GetDrvCtrl::
  3364.             * ドライブ状況を得る
  3365.             move.w    d6,-(sp)
  3366.             DOS    _DRVCTRL
  3367.             addq.w    #2,sp
  3368.             move.b    d0,d5
  3369.             move.b    d5,d0
  3370.             andi.b    #7,d0
  3371.             cmpi.b    #2,d0
  3372.             @ifeq    {
  3373.                 clr.l    @IOCTRLBuf(a6)
  3374.                 pea    @IOCTRLBuf(a6)
  3375.                 move.w    #-1,-(sp)
  3376.                 move.w    d6,-(sp)
  3377.                 move.w    #13,-(sp)
  3378.                 DOS    _IOCTRL
  3379.                 lea    10(sp),sp
  3380.                 @if [ cmpi.l #'SUSI',0+@IOCTRLBuf(a6) ].ne @or
  3381.                     [ cmpi.b #'E',4+@IOCTRLBuf(a6) ].ne {
  3382.                     pea    @IOCTRLBuf(a6)
  3383.                     move.w    #1,-(sp)
  3384.                     move.w    d6,-(sp)
  3385.                     move.w    #13,-(sp)
  3386.                     DOS    _IOCTRL
  3387.                     lea    10(sp),sp
  3388.                     tst.l    d0
  3389.                     @ifeq    {
  3390.                         tst.l    @IOCTRLBuf(a6)
  3391.                         @ifmi    {
  3392.                             bset    #0,d5
  3393.                             tst.w    @FormatType(a6)
  3394.                             @ifpl    {
  3395.                                 move.w    #SDD_FormatType_ERROR2,@FormatType(a6)
  3396.                             }
  3397.                         }
  3398.                     }
  3399.                 }
  3400.             }
  3401.             rts
  3402.  
  3403.           ?_PutDriveCapaMini::
  3404.             * ドライブ容量を出力
  3405.             move.b    d5,d0
  3406.             andi.b    #7,d0
  3407.             cmpi.b    #2,d0
  3408.             @ifeq    {
  3409.                 move.l    @XDPBPtr(a6),a1
  3410.  
  3411.                 move.b    @MediaID(a6),d0
  3412.                 cmpi.b    #$f5,@MediaID(a6)
  3413.                 @ifeq    {
  3414.                     * CD-ROMだけ特殊処理
  3415.                     pea    @DSKFREBuf(a6)
  3416.                     move.w    d6,-(sp)
  3417.                     DOS    _DSKFRE
  3418.                     addq.w    #6,sp
  3419.                     move.w    4+@DSKFREBuf(a6),d0
  3420.                     mulu    6+@DSKFREBuf(a6),d0
  3421.                     lsr.l    #8,d0
  3422.                     mulu    2+@DSKFREBuf(a6),d0
  3423.                     lsr.l    #2,d0
  3424.                 } @else {
  3425.                     move.w    XDPB_SecByte(a1),d0
  3426.                     mulu    XDPB_CluNum(a1),d0
  3427.                     move.b    XDPB_SftCluSec(a1),d1
  3428.                     lsl.l    d1,d0
  3429.                     move.w    XDPB_SecByte(a1),d1
  3430.                     mulu    XDPB_DataSec(a1),d1
  3431.                     add.l    d1,d0
  3432.                     moveq.l    #10,d1
  3433.                     lsr.l    d1,d0
  3434.                 }
  3435.                 subq.l    #3,d0
  3436.                 @ifcs    {
  3437.                     moveq.l    #0,d0
  3438.                 }
  3439.                 cmpi.l    #10000,d0
  3440.                 @ifcc    {
  3441.                     moveq.l    #10,d1
  3442.                     lsr.l    d1,d0
  3443.                     moveq.l    #4,d1
  3444.                     bsr    PrintDec
  3445.                     lea    [ 'M ',0 ](pc),a1
  3446.                     StrCpy    (a1)+,(a0)+
  3447.                     subq.w    #1,a0
  3448.                 } @else {
  3449.                     moveq.l    #4,d1
  3450.                     bsr    PrintDec
  3451.                     lea    [ 'K ',0 ](pc),a1
  3452.                     StrCpy    (a1)+,(a0)+
  3453.                     subq.w    #1,a0
  3454.                 }
  3455.             } @else {
  3456.                 lea    [ '----- ',0 ](pc),a1
  3457.                 StrCpy    (a1)+,(a0)+
  3458.                 subq.w    #1,a0
  3459.             }
  3460.             rts
  3461.  
  3462.           ?_PutDriveCapa::
  3463.             * ドライブ容量を出力
  3464.             move.b    d5,d0
  3465.             andi.b    #7,d0
  3466.             cmpi.b    #2,d0
  3467.             @ifeq    {
  3468.                 pea    @DSKFREBuf(a6)
  3469.                 move.w    d6,-(sp)
  3470.                 DOS    _DSKFRE
  3471.                 addq.w    #6,sp
  3472.                 move.w    4+@DSKFREBuf(a6),d2
  3473.                 mulu    6+@DSKFREBuf(a6),d2
  3474.                 lsr.l    #8,d2
  3475.                 move.w    2+@DSKFREBuf(a6),d3
  3476.                 sub.w    0+@DSKFREBuf(a6),d3
  3477.                 mulu    d2,d3
  3478.                 lsr.l    #2,d3
  3479.                 move.w    2+@DSKFREBuf(a6),d4
  3480.                 mulu    d2,d4
  3481.                 lsr.l    #2,d4
  3482.  
  3483.                 move.l    d3,d0
  3484.                 moveq.l    #8,d1
  3485.                 bsr    PrintDec
  3486.                 move.b    #'/',(a0)+
  3487.                 move.l    d4,d0
  3488.                 moveq.l    #8,d1
  3489.                 bsr    PrintDec
  3490.                 lea    [ ' (',0 ](pc),a1
  3491.                 StrCpy    (a1)+,(a0)+
  3492.                 subq.w    #1,a0
  3493.                 move.w    2+@DSKFREBuf(a6),d0
  3494.                 sub.w    0+@DSKFREBuf(a6),d0
  3495.                 move.w    2+@DSKFREBuf(a6),d1
  3496.                 @ifne    {
  3497.                     mulu    #100,d0
  3498.                     divu    d1,d0
  3499.                     andi.l    #$ffff,d0
  3500.                 } @else {
  3501.                     moveq.l    #0,d0
  3502.                 }
  3503.                 moveq.l    #3,d1
  3504.                 bsr    PrintDec
  3505.                 lea    [ '%) ',0 ](pc),a1
  3506.                 StrCpy    (a1)+,(a0)+
  3507.                 subq.w    #1,a0
  3508.             } @else {
  3509.                 lea    [ '--------/-------- (---%) ',0 ](pc),a1
  3510.                 StrCpy    (a1)+,(a0)+
  3511.                 subq.w    #1,a0
  3512.             }
  3513.             rts
  3514.  
  3515.           ?_PutDrvCtrl::
  3516.             * ドライブ状況を出力
  3517.             move.b    #'[',(a0)+
  3518.             move.b    d5,d0
  3519.             btst    #6,d0
  3520.             @ifcl    {
  3521.                 move.b    #'R',(a0)+
  3522.             } @else {
  3523.                 move.b    #'-',(a0)+
  3524.             }
  3525.             move.b    d5,d0
  3526.             btst    #3,d0
  3527.             @ifst    {
  3528.                 move.b    #'P',(a0)+
  3529.             } @else {
  3530.                 move.b    #'-',(a0)+
  3531.             }
  3532.             lea    [ '] ',0 ](pc),a1
  3533.             StrCpy    (a1)+,(a0)+
  3534.             subq.w    #1,a0
  3535.             rts
  3536.  
  3537.           ?_PutOption::
  3538.             ToSuper
  3539.             lea    [ '(',0 ](pc),a1
  3540.             StrCpy    (a1)+,(a0)+
  3541.             subq.w    #1,a0
  3542.             move.l    @XDPBPtr(a6),a1
  3543.             move.l    XDPB_DEVHPtr(a1),a1
  3544.             cmpi.l    #$012a5355,0+DEVH_Name(a1)    * $01,'*SU'
  3545.             bne    ?_PutOption_NonSUSIE
  3546.             cmpi.l    #$5349452a,4+DEVH_Name(a1)    * 'SIE*'
  3547.             bne    ?_PutOption_NonSUSIE
  3548.             move.l    a0,-(sp)
  3549.             bsr    ClrSpOptionBuf
  3550.             lea    __DEVD_HOOK-__SUSIEDEVH(a1),a0
  3551.             lea    @SpOptionBuf(a6),a1
  3552.             moveq.l    #SDDCALL_GetSpecialOptionSDD,d0
  3553.             jsr    (a0)
  3554.             move.l    (sp)+,a0
  3555.             bsr    GetSpOptionBuf
  3556.             * VEWB
  3557.             moveq.l    #'-',d0
  3558.             move.b    @Status_V(a6),d0
  3559.             @switch [ d0 ].b {
  3560.               @case    #1:
  3561.                 move.b    #'V',d0
  3562.                 @break;
  3563.               @case    #2:
  3564.                 move.b    #'2',d0
  3565.                 @break;
  3566.               @case    #3:
  3567.                 move.b    #'3',d0
  3568.                 @break;
  3569.               @default:
  3570.                 moveq.l    #'-',d0
  3571.                 @break;
  3572.             }
  3573.             move.b    d0,(a0)+
  3574.             moveq.l    #'-',d0
  3575.             tst.b    @Status_E(a6)
  3576.             @ifst    {
  3577.                 move.b    #'E',d0
  3578.             }
  3579.             move.b    d0,(a0)+
  3580.             moveq.l    #'-',d0
  3581.             tst.b    @Status_W(a6)
  3582.             @ifst    {
  3583.                 move.b    #'W',d0
  3584.             }
  3585.             move.b    d0,(a0)+
  3586.             moveq.l    #'-',d0
  3587.             tst.b    @Status_B(a6)
  3588.             @ifst    {
  3589.                 move.b    #'B',d0
  3590.             }
  3591.             move.b    d0,(a0)+
  3592.             moveq.l    #'-',d0
  3593.             tst.b    @Status_H(a6)
  3594.             @ifst    {
  3595.                 move.b    #'H',d0
  3596.             }
  3597.             move.b    d0,(a0)+
  3598.             *
  3599.             move.b    #')',(a0)+
  3600.             * -TI
  3601.             lea    [ '   -',0 ](pc),a1
  3602.             StrCpy    (a1)+,(a0)+
  3603.             subq.w    #1,a0
  3604.             move.l    @Status_TI(a6),d0
  3605.             @ifne    {
  3606.                 subq.w    #4,a0
  3607.                 moveq.l    #4,d1
  3608.                 bsr    PrintDec
  3609.             }
  3610.             * -TE
  3611.             lea    [ '   -',0 ](pc),a1
  3612.             StrCpy    (a1)+,(a0)+
  3613.             subq.w    #1,a0
  3614.             move.l    @Status_TE(a6),d0
  3615.             @ifne    {
  3616.                 subq.w    #4,a0
  3617.                 moveq.l    #4,d1
  3618.                 bsr    PrintDec
  3619.             }
  3620.             * -TW
  3621.             lea    [ '   -',0 ](pc),a1
  3622.             StrCpy    (a1)+,(a0)+
  3623.             subq.w    #1,a0
  3624.             move.l    @Status_TW(a6),d0
  3625.             @ifne    {
  3626.                 subq.w    #4,a0
  3627.                 moveq.l    #4,d1
  3628.                 bsr    PrintDec
  3629.             }
  3630.             bra    ?_PutOption_e
  3631.           ?_PutOption_NonSUSIE::
  3632.             lea    [ '-----)   -   -   -',0 ](pc),a1
  3633.             StrCpy    (a1)+,(a0)+
  3634.             subq.w    #1,a0
  3635.           ?_PutOption_e::
  3636.             lea    [ ' ',0 ](pc),a1
  3637.             StrCpy    (a1)+,(a0)+
  3638.             subq.w    #1,a0
  3639.             ToUser
  3640.             rts
  3641.  
  3642.           ?_PutVolume::
  3643.             * ボリューム名を出力
  3644.             moveq.l    #'A'-1,d0
  3645.             add.b    d6,d0
  3646.             move.b    d0,(a0)+
  3647.             lea    [ ':',0 ](pc),a1
  3648.             StrCpy    (a1)+,(a0)+
  3649.             subq.w    #1,a0
  3650.             move.b    d5,d0
  3651.             andi.b    #7,d0
  3652.             cmpi.b    #2,d0
  3653.             @ifeq    {
  3654.                 move.l    a0,-(sp)
  3655.                 lea    @FILESNameBuf(a6),a0
  3656.                 moveq.l    #'A'-1,d0
  3657.                 add.b    d6,d0
  3658.                 move.b    d0,(a0)+
  3659.                 lea    [ ':\*.*',0 ](pc),a1
  3660.                 StrCpy    (a1)+,(a0)+
  3661.                 move.l    (sp)+,a0
  3662.                 move.w    ##ATR_V,-(sp)
  3663.                 pea    @FILESNameBuf(a6)
  3664.                 pea    @FILESBuf(a6)
  3665.                 DOS    _FILES
  3666.                 lea    10(sp),sp
  3667.                 tst.l    d0
  3668.                 @ifpl    {
  3669.                     pea    @NAMECKBuf(a6)
  3670.                     pea    SFLS_Name+@FILESBuf(a6)
  3671.                     DOS    _NAMECK
  3672.                     addq.w    #8,sp
  3673.                     lea    SNCK_Name+@NAMECKBuf(a6),a1
  3674.                     StrCpy    (a1)+,(a0)+
  3675.                     subq.w    #1,a0
  3676.                     lea    SNCK_Ext+@NAMECKBuf(a6),a1
  3677.                     tst.b    (a1)+
  3678.                     @ifne    {
  3679.                         StrCpy    (a1)+,(a0)+
  3680.                         subq.w    #1,a0
  3681.                     }
  3682.                 } @else {
  3683.                     lea    [ '(No Volume Name)',0 ](pc),a1
  3684.                     StrCpy    (a1)+,(a0)+
  3685.                     subq.w    #1,a0
  3686.                 }
  3687.             } @else {
  3688.                 lea    [ '** Not Inserted **',0 ](pc),a1
  3689.                 move.w    @FormatType(a6),d0
  3690.                 @switch [ d0 ].b {
  3691.                   @case    #SDD_FormatType_ERROR3:
  3692.                     lea    [ '** Unconnected **',0 ](pc),a1
  3693.                     @break;
  3694.                   @case    #SDD_FormatType_ERROR2:
  3695.                     lea    [ '** Unrecognized **',0 ](pc),a1
  3696.                     @break;
  3697.                   @case    #SDD_FormatType_Audio:
  3698.                     lea    [ '** Audio Only **',0 ](pc),a1
  3699.                     @break;
  3700.                 }
  3701.                 StrCpy    (a1)+,(a0)+
  3702.                 subq.w    #1,a0
  3703.             }
  3704.             rts
  3705.  
  3706.           ?_Disp::
  3707.             lea    [ 13,10,0 ](pc),a1
  3708.             StrCpy    (a1)+,(a0)+
  3709.             subq.w    #1,a0
  3710.             pea    @MesBuf(a6)
  3711.             DOS    _PRINT
  3712.             addq.w    #4,sp
  3713.             rts
  3714.  
  3715.         }
  3716.  
  3717.  
  3718. *************************************************************************
  3719.  
  3720.  
  3721. *    void    PrintStatus2( void );
  3722. *
  3723. *        ステータス精細表示
  3724. *        in    なし
  3725. *        out    なし
  3726.  
  3727.  
  3728.         @xproc    [ PrintStatus2 ] {
  3729.             movem.l    d1-d7/a0-a6,-(sp)
  3730.  
  3731.             bsr    PrintStatus_GetSUSIEDeviceInfo
  3732.             bsr    PrintStatus_Sub2
  3733.  
  3734.             movem.l    (sp)+,d1-d7/a0-a6
  3735.             rts
  3736.         }
  3737.  
  3738.  
  3739. *************************************************************************
  3740.  
  3741.  
  3742. *    void    PrintStatusAll( void );
  3743. *
  3744. *        ステータス表示
  3745. *        in    なし
  3746. *        out    なし
  3747.  
  3748.  
  3749.         @xproc    [ PrintStatusAll ] {
  3750.             movem.l    d1-d7/a0-a6,-(sp)
  3751.  
  3752.             pea    [ '[SUSIE recognizable drive]',13,10,0 ](pc)
  3753.             DOS    _PRINT
  3754.             addq.w    #4,sp
  3755.  
  3756.             moveq.l    #0,d7
  3757.             moveq.l    #8-1,d6
  3758.             tst.b    @ReadyTWOSCSI(a6)
  3759.             @ifst    {
  3760.                 moveq.l    #16-1,d6
  3761.             }
  3762.             @repeat [ d6 ].w {
  3763.                 move.l    d7,-(sp)
  3764.                 @repeat [ d5, #9-1 ].q {    * LUN対策
  3765.                     move.l    d7,@CmdSCSI_ID(a6)
  3766.                     bsr    MakeID2Drive
  3767.                     bsr    PrintStatus_Sub3
  3768.                     addi.l    #$10000,d7
  3769.                 }
  3770.                 move.l    (sp)+,d7
  3771.                 addq.b    #1,d7
  3772.             }
  3773.  
  3774.             pea    [ '[SUSIE non-recognizable drive]',13,10,0 ](pc)
  3775.             DOS    _PRINT
  3776.             addq.w    #4,sp
  3777.  
  3778.             move.l    #-1,@CmdSCSI_ID(a6)
  3779.             bsr    MakeID2Drive2
  3780.             bsr    PrintStatus_Sub3
  3781.  
  3782.             movem.l    (sp)+,d1-d7/a0-a6
  3783.             rts
  3784.         }
  3785.  
  3786.  
  3787. *************************************************************************
  3788.  
  3789.  
  3790. *    void    PrintStatusAll2( void );
  3791. *
  3792. *        ステータス精細表示
  3793. *        in    なし
  3794. *        out    なし
  3795.  
  3796.  
  3797.         @xproc    [ PrintStatusAll2 ] {
  3798.             movem.l    d1-d7/a0-a6,-(sp)
  3799.  
  3800.             pea    [ '[SUSIE recognizable drive]',13,10,0 ](pc)
  3801.             DOS    _PRINT
  3802.             addq.w    #4,sp
  3803.  
  3804.             moveq.l    #0,d7
  3805.             moveq.l    #8-1,d6
  3806.             tst.b    @ReadyTWOSCSI(a6)
  3807.             @ifst    {
  3808.                 moveq.l    #16-1,d6
  3809.             }
  3810.             @repeat [ d6 ].w {
  3811.                 move.l    d7,-(sp)
  3812.                 @repeat [ d5, #9-1 ].q {    * LUN対策
  3813.                     move.l    d7,@CmdSCSI_ID(a6)
  3814.                     bsr    MakeID2Drive
  3815.                     bsr    PrintStatus_Sub4
  3816.                     addi.l    #$10000,d7
  3817.                 }
  3818.                 move.l    (sp)+,d7
  3819.                 addq.b    #1,d7
  3820.             }
  3821.  
  3822.             pea    [ '[SUSIE non-recognizeable drive]',13,10,0 ](pc)
  3823.             DOS    _PRINT
  3824.             addq.w    #4,sp
  3825.  
  3826.             move.l    #-1,@CmdSCSI_ID(a6)
  3827.             bsr    MakeID2Drive2
  3828.             bsr    PrintStatus_Sub4
  3829.  
  3830.             movem.l    (sp)+,d1-d7/a0-a6
  3831.             rts
  3832.         }
  3833.  
  3834.  
  3835. *************************************************************************
  3836.  
  3837.  
  3838. *    void    PrintDec( void );
  3839. *
  3840. *        10進数を出力する。
  3841. *        in    d0    数値
  3842. *            d1    桁数
  3843. *            a0    出力バッファ
  3844. *        out    なし
  3845.  
  3846.  
  3847.         @xproc    [ PrintDec ] {
  3848.             @param    [ d0, Number ].l;
  3849.             @param    [ d1, Column ].w;
  3850.             @param    [ a0, Buf ].w;
  3851.  
  3852.             movem.l    d0-d7/a1-a5,-(sp)
  3853.  
  3854.             move.l    a0,a1
  3855.             lea    ?_Table(pc),a2
  3856.             @do {
  3857.                 move.l    (a2),d2
  3858.                 @break.eq;
  3859.                 cmp.l    d2,Number
  3860.                 @break.cc;
  3861.                 addq.l    #4,a2
  3862.             } @while.t;
  3863.  
  3864.             moveq.l    #0,d4
  3865.             tst.l    d2
  3866.             @ifeq    {
  3867.                 move.b    #'0',(a1)+
  3868.                 addq.w    #1,d4
  3869.             } @else {
  3870.                 @do {
  3871.                     move.l    (a2)+,d2
  3872.                     @break.eq;
  3873.                     moveq.l    #'0'-1,d3
  3874.                     @do {
  3875.                         addq.w    #1,d3
  3876.                         sub.l    d2,Number
  3877.                     } @while.cc;
  3878.                     add.l    d2,Number
  3879.                     move.b    d3,(a1)+
  3880.                     addq.w    #1,d4
  3881.                 } @while.t;
  3882.             }
  3883.             clr.b    (a1)
  3884.             move.l    a1,a0
  3885.             cmp.w    Column,d4
  3886.             @ifcs    {
  3887.                 move.w    Column,d5
  3888.                 sub.w    d4,d5
  3889.                 lea    (a1,d5.w),a2
  3890.                 clr.b    (a2)
  3891.                 move.l    a2,a0
  3892.                 subq.w    #1,d4
  3893.                 @repeat [ d4 ].w {
  3894.                     move.b    -(a1),-(a2)
  3895.                 }
  3896.                 subq.w    #1,d5
  3897.                 @repeat [ d5 ].w {
  3898.                     move.b    #' ',-(a2)
  3899.                 }
  3900.             }
  3901.  
  3902.             movem.l    (sp)+,d0-d7/a1-a5
  3903.             rts
  3904.           ?_Table::
  3905.             dc.l    1000000000
  3906.             dc.l    100000000
  3907.             dc.l    10000000
  3908.             dc.l    1000000
  3909.             dc.l    100000
  3910.             dc.l    10000
  3911.             dc.l    1000
  3912.             dc.l    100
  3913.             dc.l    10
  3914.             dc.l    1
  3915.             dc.l    0
  3916.         }
  3917.  
  3918.  
  3919. *************************************************************************
  3920.  
  3921.  
  3922. *    void    PrintHex( void );
  3923. *
  3924. *        16進数を出力する。
  3925. *        in    d0    数値
  3926. *            d1    桁数
  3927. *            a0    出力バッファ
  3928. *        out    なし
  3929.  
  3930.  
  3931.         @xproc    [ PrintHex ] {
  3932.             @param    [ d0, Number ].l;
  3933.             @param    [ d1, Column ].w;
  3934.             @param    [ a0, Buf ].w;
  3935.  
  3936.             movem.l    d0-d7/a1-a5,-(sp)
  3937.  
  3938.             move.l    a0,a1
  3939.             lea    ?_Table(pc),a2
  3940.             @do {
  3941.                 move.l    (a2),d2
  3942.                 @break.eq;
  3943.                 cmp.l    d2,Number
  3944.                 @break.cc;
  3945.                 addq.l    #4,a2
  3946.             } @while.t;
  3947.  
  3948.             lea    ?_Table2(pc),a3
  3949.             moveq.l    #0,d4
  3950.             tst.l    d2
  3951.             @ifeq    {
  3952.                 move.b    #'0',(a1)+
  3953.                 addq.w    #1,d4
  3954.             } @else {
  3955.                 @do {
  3956.                     move.l    (a2)+,d2
  3957.                     @break.eq;
  3958.                     moveq.l    #0,d3
  3959.                     @do {
  3960.                         addq.w    #1,d3
  3961.                         sub.l    d2,Number
  3962.                     } @while.cc;
  3963.                     add.l    d2,Number
  3964.                     move.b    (a3,d3.w),(a1)+
  3965.                     addq.w    #1,d4
  3966.                 } @while.t;
  3967.             }
  3968.             clr.b    (a1)
  3969.             move.l    a1,a0
  3970.             cmp.w    Column,d4
  3971.             @ifcs    {
  3972.                 move.w    Column,d5
  3973.                 sub.w    d4,d5
  3974.                 lea    (a1,d5.w),a2
  3975.                 clr.b    (a2)
  3976.                 move.l    a2,a0
  3977.                 subq.w    #1,d4
  3978.                 @repeat [ d4 ].w {
  3979.                     move.b    -(a1),-(a2)
  3980.                 }
  3981.                 subq.w    #1,d5
  3982.                 @repeat [ d5 ].w {
  3983.                     move.b    #'0',-(a2)
  3984.                 }
  3985.             }
  3986.  
  3987.             movem.l    (sp)+,d0-d7/a1-a5
  3988.             rts
  3989.           ?_Table::
  3990.             dc.l    $10000000
  3991.             dc.l    $1000000
  3992.             dc.l    $100000
  3993.             dc.l    $10000
  3994.             dc.l    $1000
  3995.             dc.l    $100
  3996.             dc.l    $10
  3997.             dc.l    $1
  3998.             dc.l    0
  3999.           ?_Table2::
  4000.             dc.b    '0123456789ABCDEF'
  4001.             .even
  4002.         }
  4003.  
  4004.  
  4005. *************************************************************************
  4006.  
  4007.  
  4008. *    void    PRINTHELP( void );
  4009. *
  4010. *        ヘルプ表示処理
  4011. *        in    なし
  4012. *        out    帰らない。_EXITする。
  4013.  
  4014.  
  4015.         @xproc    [ PRINTHELP ] {
  4016.             pea    [
  4017.                    " SCSIデバイスドライバ。",13,10
  4018.                 13,10
  4019.                    " Usage:    susie.x [Drv...] [Option]",13,10
  4020.                    "    DEVICE = SUSIE.X [Drv...] [Option]",13,10
  4021.                    " Drv:    対象ドライブを[A:]~[Z:][@:][*:]でひとつ以上指定します。",13,10
  4022.                    " Option:-IDn    対象IDをnにします。",13,10
  4023.                    "    -LUNn    対象LUNをnにします。",13,10
  4024.                    "    -P    ステータスを表示します。",13,10
  4025.                    "    -I    ステータスの表示を精細にします。",13,10
  4026.                    "    -R    常駐解除します。",13,10
  4027.                    "    -K    常駐時に元のドライバを保存します。",13,10
  4028.                    "    -RS    SCSIバスリセットを行ないます。",13,10
  4029.                    "    -Vn    nでベリファイ方法を決定します。0=Soft, 1=Hard, 2=Wrt&Verify, 3=なし。",13,10
  4030.                    "    -En    n=1でEject状態、n=0でEject状態を解除します。",13,10
  4031.                    "    -Wn    n=1でProtect状態、n=0でProtect状態を解除します。",13,10
  4032.                    "    -Bn    n=1でBusy待ちを行ない、n=0で行ないません。",13,10
  4033.                    "    -Hn    n=1で高速認識モード、n=0で行ないません。",13,10
  4034.                    "    -Un    n=1で機器未接続時でも常駐、n=0で行ないません。常駐時のみ有効。",13,10
  4035.                    "    -RBn    n=1でMac resourceを表示し、n=0で行ないません。",13,10
  4036.                    "    -AAn    n=1で非互換CDPlayモード、n=0で互換CDPlayモード。",13,10
  4037.                    "    -TIn    Insert監視間隔をn/100秒にします。def=100",13,10
  4038.                    "    -TEn    Eject監視間隔をn/100秒にします。def=100",13,10
  4039.                    "    -TWn    リトライ待ち時間をn/100秒にします。def=20",13,10
  4040.                    "    -Cn    内部バッファサイズをnにします。常駐時のみ有効。def=16(CD-ROM),8(other)",13,10
  4041.                    "    -SI    メッセージを抑制します。",13,10
  4042.                 0
  4043.             ](pc)
  4044.             DOS    _PRINT
  4045.             addq.w    #4,sp
  4046.  
  4047.             bsr    RemainSubst
  4048.  
  4049.             tst.b    (DeviceInstalled)
  4050.             bst    DDD_INSTALL_Err_Quit
  4051.  
  4052.             DOS    _EXIT
  4053.         }
  4054.  
  4055.  
  4056. *************************************************************************
  4057.  
  4058.  
  4059.         .even
  4060.         @STRSEC;
  4061.         .even
  4062.  
  4063.  
  4064. *************************************************************************
  4065.  
  4066.  
  4067.         .bss
  4068.         .even
  4069.         ds.b    SizeOfWork
  4070.         .even
  4071. BSSEND::
  4072.         .stack
  4073. STACKEND::
  4074.  
  4075.         * 常駐時バッファ確保用ダミー
  4076.         ds.b    (MAXCDROMCacheBufSize-DEFCDROMCacheBufSize)*SoftVerifyBufSecSize    =    2048
  4077.  
  4078. PEND::
  4079.         .end    EXEC_START
  4080.  
  4081.  
  4082.